java - 导致其他组件不显示的绘制方法

标签 java swing user-interface paint repaint

我有一个简单的 GUI 程序,我正在尝试开始工作。当用户按下底部按钮时,我试图绘制一些形状。当我摆脱paint()中的if(buttonClicked)时,一切都显示正常,但paint()似乎是自动执行的,并且形状出现时没有任何按钮单击。当我用 if(buttonClicked) 添加包围 Paint() 主体时,无论 ButtonHandler 类如何处理它,我的其余组件甚至不会显示在框架中。我不知道为什么会发生这种情况。在 Paint() 中使用或不使用 if 逻辑测试代码,您将看到发生了什么。

 public class GUI extends JFrame {

      //declare components
     Container container;
     JPanel centerPanel, northPanel, southPanel, eastPanel, westPanel, mouseClickPanel;
     JLabel topLabel;
     JTextArea textArea;
     JButton buttonA, buttonB, drawButton;
     boolean buttonClicked;

     public GUI(String title) {

         super(title); // invoke JFrame Constructor

         container = getContentPane();
         container.setLayout(new BorderLayout());

         centerPanel = new JPanel();
         centerPanel.setBackground(Color.CYAN);
         northPanel = new JPanel();
         northPanel.setBackground(Color.GREEN);
         southPanel = new JPanel();
         southPanel.setBackground(Color.MAGENTA);
         eastPanel = new JPanel();
         eastPanel.setBackground(Color.ORANGE);
         westPanel = new JPanel();
         westPanel.setBackground(Color.YELLOW);
         mouseClickPanel = new JPanel();
         mouseClickPanel.setBackground(Color.GRAY);
         mouseClickPanel.setPreferredSize(new Dimension(400, 400));

         topLabel = new JLabel("Press either button to make something happen");
         topLabel.setFont(new Font("Calibri", Font.PLAIN, 16));
         topLabel.setHorizontalAlignment(JLabel.CENTER);

         textArea = new JTextArea(3, 20);
         textArea.setEditable(false);
         buttonA = new JButton("Press Here");
         buttonB = new JButton("Press Here");
         drawButton = new JButton("Press here");

         container.add(centerPanel, BorderLayout.CENTER);
         container.add(northPanel, BorderLayout.NORTH);
         container.add(southPanel, BorderLayout.SOUTH);
         container.add(eastPanel, BorderLayout.EAST);
         container.add(westPanel, BorderLayout.WEST);

         northPanel.add(topLabel, BorderLayout.NORTH);
         centerPanel.add(buttonA);
         centerPanel.add(textArea);
         centerPanel.add(buttonB);
         centerPanel.add(mouseClickPanel);
         centerPanel.add(drawButton);

         buttonClicked = false;
         ButtonHandler buttonHandler = new ButtonHandler(buttonA, drawButton, textArea, buttonClicked);



         buttonA.addActionListener(buttonHandler); // add actionListeners to buttonA and B
         buttonB.addActionListener(buttonHandler);
         drawButton.addActionListener(buttonHandler);

         setSize(525, 600);
         setVisible(true);
     }



     public void paint(Graphics g) {


        if (buttonClicked) {
            super.paint(g);

            g.setColor(Color.RED);
            g.fillOval(150, 150, 50, 50);
            g.draw3DRect(200, 200, 50, 50, true);
        }
     }
 }

处理程序类:

 public class ButtonHandler extends JFrame implements ActionListener {

     private JButton buttonA, drawButton;
     private JTextArea textArea;
     boolean buttonClicked;

 public ButtonHandler(JButton buttonA, JButton drawButton, JTextArea textArea, boolean buttonClicked) {
    this.buttonA = buttonA;
    this.textArea = textArea;
    this.drawButton = drawButton;
    this.buttonClicked = buttonClicked;

}

@Override
public void actionPerformed(ActionEvent e) {

    if (e.getSource() == buttonA) {
        textArea.setText(" <- You pressed left button");
    }
    else if (e.getSource() == drawButton) {

        textArea.setText("You pressed button to draw rectangle");
        buttonClicked = true;
        repaint();
    }
    else {
        textArea.setText("You pressed right button ->");
    }
}
}

最佳答案

super.paint(g); 从 if 语句中取出。将其作为第一行。否则,除非单击该按钮,否则根本不会进行任何绘制(包括 JPanel 内部结构,例如背景)。

关于java - 导致其他组件不显示的绘制方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29547479/

相关文章:

java - 查找 Java JButton 数组的索引

java - JTable 中的 JPanel 中的工具提示不起作用

matlab - 在 Matlab GUI 中拖放文件

c# - 组合框下拉菜单出现在窗口下方

java - 范围混淆(对我来说): DefaultTableModel keeps reference to Vector. 为什么?

java - 如何使 Jpanel 的所有区域可拖动,包括其中的 JSVGCanvas

java - 以编程方式在 RecyclerView 项目(项目中的某个元素)上设置背景颜色

java - 如何在 Java 中将 ActionListener 添加到 JButton 上

java - 类方法返回0

java:如何实现数学解析