2016-07-09 8 views
2

Я новичок в программировании на Java, и в первый раз я разрабатываю приложение swing в java Swing. Я хочу реализовать простой редактор, который имеет несколько кнопок, чтобы добавить простые фигуры, такие как прямоугольник, квадрат и т. Д. Проблема в том, что я не могу печатать фигуры без actionListener, но я хочу использовать кнопки для выполнения действия для меня. Я хочу напечатать или нарисовать форму всякий раз, когда я нажимал кнопку на том же фрейме, что у меня есть кнопки.Java Swing с обработкой событий

У меня есть DrawingPanel.java файл, который я получил его из Интернета, и я написал эти два других класса:

import java.awt.*; 
import javax.swing.*; 

public class addRect extends JPanel { 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.fillRect(50, 30, 200, 100); 
     g.setColor(Color.BLUE); 

    } 
} 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*;` 

public class test {  
    public static void main(String[] args) { 
     new test(); 
    } 

     public JFrame frame; 
     private JButton button1; 
     private JButton button2; 
     private JButton button3; 
     private JButton button4; 

    public test() { 

     frame = new JFrame("Paint Program"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(new Dimension(350, 100)); 
     button1=new JButton("AddRectangle"); 
     button2=new JButton("AddSquare"); 
     button3=new JButton("AddCircle"); 
     button4=new JButton("Clear"); 

     frame.setVisible(true); 
     button1.addActionListener(new VerifyListener()); 


     frame.setLayout(new FlowLayout()); 
     frame.add(button1); 
     frame.add(button2); 
     frame.add(button3); 
     frame.add(button4); 
    } 
    public class VerifyListener implements ActionListener { 
     public void actionPerformed(ActionEvent event) { 
      addRect panel=new addRect(); 
      frame.add(panel); 
      panel.setVisible(true); 
     } 
    } 
} 
+0

'" Проблема заключается в том, что я не могу печатать формы без ActionListener, но я хочу использовать кнопки, чтобы сделать действие для меня. «Я не вижу здесь проблемы - просто добавьте необходимые ActionListeners (или, возможно, AbstractActions) к кнопкам, которые в них нуждаются. Одна проблема с вашим кодом, вы не захотите добавлять JPanels при нажатии кнопки, а скорее иметь один чертеж JPanel, состояние которого изменяется нажатием кнопки. Пожалуйста, уточните свой вопрос/проблему. –

+0

, когда я запускаю код, он работает без каких-либо проблем и показывает все кнопки. Но когда я нажимаю кнопку Button1 (addRectangle), он просто не рисует прямоугольник для меня. –

+0

Это потому, что: 1) вы добавляете JPanel таким образом, что вам не следует делать - он должен быть в графическом интерфейсе с самого начала, а 2) вы не вызвали повторный аттестат и перерисовку на контейнере после добавления компонента , и 3) предпочтительный размер чертежа JPanel в настоящее время равен 0,0, и поэтому это размер, который он добавляет. –

ответ

3

У вас есть несколько проблем с кодом выше:

  • Ваш addRect Предпочтительный размер JPanel равен 0, 0, и поэтому, если и когда он будет добавлен в графический интерфейс, он никогда не отобразится.
  • Вы добавляете компонент в контейнер (область содержимого JFrame) во время прогона программы, но не вызывали в контейнере revalidate() и repaint(), и поэтому менеджеры макета контейнера не будут компоновать новый компонент.
  • Нельзя менять изображения, добавляя JPanels. Вместо этого вы должны иметь один чертеж JPanel и изменить его, вызывая публичные методы.
  • Не звоните setVisible(true) на ваш JFrame до после, добавляя к нему компоненты, иначе некоторые компоненты могут не отображаться.
  • Избегайте устанавливать размер любого компонента Swing и вместо этого сами компоновщики и менеджеры компоновки сами себя оценивают.
  • В стороне, вы захотите изучить и использовать Java naming conventions. Имена переменных должны начинаться с нижней буквы, а имена классов - с буквой верхнего регистра. Изучение этого и последующее это позволит нам лучше понять ваш код и позволит вам лучше понять код других.

Например, в приведенном ниже коде, у меня создать несколько кнопок, и передал их анонимные ActionListeners, большинство из них с ООН Реализуемый кодом, и один из них, слушатель, который вызывает addRectangle(), с реализованными код. В реализации у меня просто метод вызывает метод на объекте DrawingPanel: drawingPanel.setDrawRect(true);. Этот метод изменяет состояние логического элемента drawRect, содержащегося в классе DrawingPanel, а затем вызывает repaint() на этом JPanel. Метод paintComponent В JPanel использует булевый, чтобы решить, следует ли нарисовать прямоугольник или нет:

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class TestDrawingPanel extends JPanel { 
    private JButton addRectButton = new JButton("Add Rectangle"); 
    private JButton addSquareButton = new JButton("Add Square"); 
    private JButton addCircleButton = new JButton("Add Circle"); 
    private JButton clearButton = new JButton("Clear"); 

    private DrawingPanel drawingPanel = new DrawingPanel(); 

    public TestDrawingPanel() { 
     // add ActionListeners 
     addRectButton.addActionListener(evt -> addRectangle()); 
     addSquareButton.addActionListener(evt -> addSquare()); 
     addCircleButton.addActionListener(evt -> addCircle()); 
     clearButton.addActionListener(evt -> clear()); 
     JButton[] btns = { addRectButton, addSquareButton, addCircleButton, clearButton }; 

     // jpanel uses grid layout with one row and variable number of columns 
     // and add all buttons to it 
     JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 3, 3)); 
     for (JButton btn : btns) { 
      buttonPanel.add(btn); 
     } 

     setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); // blank border 
     setLayout(new BorderLayout()); 
     add(buttonPanel, BorderLayout.PAGE_START); // add button panel to the top 
     add(drawingPanel, BorderLayout.CENTER); // add drawing panel to the center 
    } 

    private void addRectangle() { 
     drawingPanel.setDrawRect(true); // tell the drawing panel to draw the rectangle 
    } 

    private void addSquare() { 
     // TODO: implement   
    } 

    private void addCircle() { 
     // TODO: implement 
    } 

    private void clear() { 
     drawingPanel.setDrawRect(false); 
     // TODO: complete 
    } 

    private static void createAndShowGui() { 
     TestDrawingPanel mainPanel = new TestDrawingPanel(); 

     JFrame frame = new JFrame("Paint Program"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

} 

// class addRect extends JPanel { 
class DrawingPanel extends JPanel { 
    // size information 
    private static final int PREF_W = 300; 
    private static final int PREF_H = PREF_W; 
    private boolean drawRect = false; // use this to decide if should draw rectangle or not 

    public DrawingPanel() { 
     setBorder(BorderFactory.createTitledBorder("Drawing Panel")); 
    } 

    // allow outside classes to set the drawRect field 
    public void setDrawRect(boolean drawRect) { 
     this.drawRect = drawRect; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     // if true, draw the rectang.e 
     if (drawRect) { 
      g.setColor(Color.BLUE); 
      g.fillRect(50, 30, 200, 100); 
     } 

     // TODO: complete rest 
    } 

    // So that the drawing JPanel will size appropriately 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^