3

该程序的想法是我在框架上的某个地方有一些按钮和一个图标。我想让按钮改变颜色。我只担心现在让所有元素都显示出来。如果我注释掉第 11-13 行,我会看到打印出的“hello”,上面有一个红色圆圈。否则,我只有“红色”按钮,没有“你好”或我的红色圆圈。所以这是我的代码:

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

public class ButtonTester 

{
    public static void main (String[] args) 
    {  
        JFrame frame = new ButtonFrame(); 
        frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
        JButton redButton = new JButton("Red");
        frame.add(redButton);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true); 
    }
}

class ButtonFrame extends JFrame 
{  
    public static final int DEFAULT_WIDTH = 300;  
    public static final int DEFAULT_HEIGHT = 200;  

    public ButtonFrame() 
    {   
        setTitle("Hello"); 
       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 
       ButtonPanel panel = new ButtonPanel(); 
       add(panel); 
    } 
} 

class ButtonPanel extends JPanel 
{ 
    public void paintComponent(Graphics g) 
    {   
        super.paintComponent(g); 
        Graphics2D g2 = (Graphics2D) g;  
        g2.drawString("Hello !", 100, 100);
        Icon ico = new ColorIcon(32);
        ico.paintIcon(null, g, 75, 75);
    } 
} 

我 90% 确定问题出在第 11-13 行,但我不确定要更改什么以使所有内容都可见。

4

1 回答 1

4

你的问题是你的 ButtonPanel 的大小是 0。让它覆盖 getPreferredSize() 你会明白我的意思:

class ButtonPanel extends JPanel {
   private static final int PREF_W = 150;
   private static final int PREF_H = PREF_W;

   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.drawString("Hello !", 100, 100);
      // !! Icon ico = new ColorIcon(32);
      // Icon ico = new ImageIcon();
      // ico.paintIcon(null, g, 75, 75);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }
}

顺便说一句,你为什么要在 paintComponent 方法中创建一个 Icon ?这对我来说没有意义,只会不必要地减慢您的图形速度。

编辑
你状态:

好的,我在覆盖 getPreferredSize() 后看到了差异但是创建图标的“更好”或“正确”方法是什么?我只是想按照 Java 教科书中的练习指示进行操作:练习 4.14。编写一个程序,显示一个框架,其中包含三个标记为“红色”、“绿色”和“蓝色”的按钮,以及一个包含一个图标的标签,该图标显示一个最初为红色的圆圈。当用户点击按钮时,圆圈的填充颜色应该会改变。更改颜色时,需要在标签上调用 repaint 方法。调用 repaint 确保调用 paintIcon 方法,以便可以使用新颜色重新绘制图标。

你需要以不同的方式思考这个问题。我自己会创建三个 ImageIcon,一个用于蓝色圆圈,一个用于红色,一个用于绿色。然后我会在我的 JFrame 上的 JLabel 中显示 ImageIcon。我会通过它的setIcon(...)方法简单地交换标签的图标来改变颜色。我不会担心搞砸,paintComponent(...)而是会尝试以尽可能简单的方式解决这个问题。

于 2013-03-03T00:38:50.237 回答