这个程序的想法是,我有一些按钮和一个图标在框架的某处。我想要按钮改变颜色。我只是担心现在所有的元素都会出现。如果我注释掉了第11-13行,我就会看到“你好”,上面有一个红色的圆圈。否则,我只有按钮“红色”,没有“你好”或我的红色圆圈。这是我的密码:
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行,但我不知道要更改什么以使一切可见。
发布于 2013-03-03 00:38:50
您的问题是您的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方法中创建图标呢?这对我来说毫无意义,只会无谓地减缓你的图形速度。
编辑
你说:
好的,我看到了重写getPreferredSize()后的不同之处,但是创建图标的“更好”或“正确”方法是什么呢?我只是试图遵循Java教科书中的练习指南:练习4.14。编写一个程序,显示一个有三个按钮标记为“红色”、“绿色”和“蓝色”的框架,以及一个包含一个图标的标签,该图标显示一个最初是红色的圆圈。当用户单击按钮时,圆圈的填充颜色应该改变。更改颜色时,需要调用标签上的重新绘制方法。对重新绘制的调用确保调用paintIcon方法,以便可以用新的颜色重新绘制图标。
你得换个角度想这件事。我自己会创建三个ImageIcons,一个是蓝色圆圈,一个是红色,另一个是绿色。然后,我将在我的ImageIcon上的JLabel中显示该JFrame。我只需通过setIcon(...)方法交换标签的图标就可以改变颜色。我不会担心paintComponent(...)的模糊化,而是会尽可能简单地解决这个问题。
https://stackoverflow.com/questions/15181120
复制相似问题