2014-08-31 4 views
-1

Может ли кто-нибудь предоставить базовый пример Java ui, в котором нажатие кнопки рисует прямоугольник на jpanel, который находится рядом с ним?Java -> Основной чертеж -> Howto -> Button click добавляет фигуру в jpanel

Вы найдете примеры рисования, где мышь была захвачена, или рисунок, статический от загрузки ui, но я не смог найти пример одного используемого компонента (щелкните), чтобы нарисовать другой компонент.

У меня есть ui, где пользователь определяет количество ящиков (строк и столбцов), а кнопка ok должна рисовать эти поля на JPanel, который имитировал лист бумаги.

Спасибо, что обратились за помощью.

+1

Этот вопрос, как представляется, не по теме, потому что речь идет о получении примеров кода. –

ответ

0

если вы хотите draw что-то на компоненте, перепишите его paintComponent-Method.

основные псевдо пример, используя JPanel:

public class MyPanel extends JPanel 
{ 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     //here your draw stuff 
     //like: 
     Graphics2D g2d = (Graphics2D)g; 
     g.drawLine(...); 
    } 
} 
+0

Спасибо за ответ. Как я уже писал, я не хочу рисовать компонент из компонента. Я ищу, чтобы нарисовать компонент из действия click другого компонента. Знаете ли вы, как это сделать? Еще раз спасибо. – InnerOrchestra

+0

Да, я знаю, что вы хотите сделать. но я боялся, что это невозможно, из коробки.когда вы нажимаете кнопку, эта кнопка может (например) создать пользовательский Shape-Object, который ваша пользовательская панель может рисовать. Создайте список ShapeList.this, содержащий все ваши фигуры. ваша пользовательская панель будет рисовать все эти фигуры в этом списке в paintComponent. – Ben

0

Вот как я это сделал. Пожалуйста, дайте мне знать, как вы улучшите этот код для начинающих! ;)

По сути, вот трюк, чтобы получить кнопку, чтобы нарисовать прямоугольник:

  • Расширьте свой главный класс приложения к JFrame (или JComponent) или ???

  • Объявление в верхней части основного приложения вашего класса для рисования (DrawCanvas) и расширение до JPanel.

  • Справа вверху вашего основного класса приложения объявлен массив ArrayList, чтобы держать вещи, которые вы рисуете.

  • Объявление переменной для класса чертежа в верхней части основного класса приложения.

  • В вашем контрольном событии (кнопка в моем случае) используйте функцию, чтобы подготовить материал для рисования (я использовал один из них - AddRectangle()).

  • В вашем классе рисования переопределите компонент paintComponent и используйте для каждого, чтобы нарисовать все материалы, которые вы прокрутили в своем массиве.

Поскольку вы не можете напрямую контролировать чертеж, вы должны понимать, что каждый раз, когда repaint() получает вызов, будет вызываться функция рисования. Это означает, что вам нужно отбросить все ваши вещи, как кровавую белку, чтобы метод рисования правильно рисовал или перерисовывал экран. В конце концов, это, как правило, куча массивов, которые вы в конечном итоге используете и кучу для каждый цикл проходит через них.

package views; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.util.ArrayList; 
import java.util.Iterator; 

import javax.swing.*; 



public class appMainWindow extends JFrame 
{ 
class PdfLocation 
{ 
    public double xPos; 
    public double yPos; 
} 

class DrawCanvas extends JPanel 
{ 
     @Override 
     public void paintComponent(Graphics g) 
     { 
     super.paintComponent(g); 
     for (PdfLocation p : PdfLocations) 
     { 
      g.drawRect((int)p.xPos, (int)p.yPos, 35, 20); 
      repaint(); 
     } 
     } 
} 

public void AddRectangle() 
{ 
    PdfImagesCount++; 
    lblPdfcount.setText(Integer.toString(PdfImagesCount)); 

    PdfLocation rect = new PdfLocation(); 

    if (PdfLocations.isEmpty() == false) 
    { 
     PdfLocation spot = PdfLocations.get(PdfLocations.size() - 1); 
     rect.xPos = spot.xPos + 45; 
     rect.yPos = 10; 
    } 
    else 
    { 
     rect.xPos = 10; 
     rect.yPos = 10;   
    } 
    PdfLocations.add(rect);    
} 

private JFrame frame; 
public ArrayList<PdfLocation> PdfLocations = new ArrayList<PdfLocation>(); 
public int PdfImagesCount = 0; 


public static final int CANVAS_HEIGHT = 700; 
public static final int CANVAS_WIDTH = 1000; 

private DrawCanvas canvas; 
private JLabel lblPdfcount; 

public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { appMainWindow window = new appMainWindow(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } 

public appMainWindow() 
{ 

    // Set up a custom drawing JPanel 
    canvas = new DrawCanvas(); 
    canvas.setBackground(Color.WHITE); 
    canvas.setBounds(150, 25, CANVAS_WIDTH, CANVAS_HEIGHT); 
    initialize(); 
} 

private void initialize() 
{ 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 1280, 850); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JButton btnAddARectangle = new JButton("Add a rectangle"); 
    btnAddARectangle.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) 
     { 
      AddRectangle(); 
      repaint(); 
     } 
    }); 
    btnAddARectangle.setBounds(0, 6, 151, 29); 
    frame.getContentPane().add(btnAddARectangle); 


    frame.getContentPane().add(canvas); 

    lblPdfcount = new JLabel("PdfCount"); 
    lblPdfcount.setBounds(10, 43, 61, 16); 
    frame.getContentPane().add(lblPdfcount); 
} 

}