不确定之前是否已经讨论过这个问题。但是我在透明的JPanel上添加透明的JTextField有一个奇怪的问题。由于某种原因(我无法挖掘到足以找到原因),还有其他画作可以实现。也许有些脏区需要处理?不确定。
让我举一个简单的例子:
public class TextFieldGame extends JPanel {
public static void main(String [] args){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame someFrame = new JFrame("Is this odd?");
someFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
someFrame.setSize(200,600);
someFrame.add(new TextFieldGame());
someFrame.setVisible(true);
}
});
}
public TextFieldGame() {
setupContentPane();
}
private void setupContentPane() {
setLayout(new BorderLayout());
final CanvasPanel canvasPanel = new CanvasPanel();
add(canvasPanel, BorderLayout.CENTER);
add(new ControlPanel(canvasPanel), BorderLayout.SOUTH);
}
public static class ControlPanel extends JPanel {
private final CanvasPanel canvasPanel;
ControlPanel(CanvasPanel canvasPanel) {
this.canvasPanel = canvasPanel;
setupContentPane();
}
private void setupContentPane() {
setLayout(new FlowLayout(FlowLayout.RIGHT));
final JButton load = new JButton("load");
add(load);
load.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
canvasPanel.addChildComponent(getComponent());
canvasPanel.revalidate();
canvasPanel.repaint();
}
});
}
private JComponent getComponent() {
final JPanel container = new JPanel();
container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
container.setOpaque(false);
for (int i = 0; i < 10; i++) {
final JTextField textField = new JTextField("why you no work?") {
@Override
public Dimension getMaximumSize() {
return new Dimension(Short.MAX_VALUE, getPreferredSize().height);
}
};
textField.setOpaque(false);
container.add(textField);
}
return container;
}
}
public static class CanvasPanel extends JPanel {
private int paintCount = 0;
CanvasPanel() {
setupContentPane();
}
public void setupContentPane() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
setBackground(Color.white);
}
public void addChildComponent(JComponent component) {
component.setAlignmentY(TOP_ALIGNMENT);
add(component);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("paint count: " + ++paintCount);
}
}
}
我添加了System out语句来显示绘制任务的计数。
首次加载时,会有2/3种颜料 - 足够公平。然后,如果要按“加载”按钮,10个透明的JTextField将被添加到透明的JPanel中,这个透明的JPanel将被添加到CanvasPanel中。 (Canvas面板又是JFrame的子代)。你会注意到这样做,将完成11个额外的油漆工作。
但是在按下“加载”之后理论上(在我的理解中),只应执行一个油漆工作。那是因为,我只向CanvasPanel添加了一个孩子(孩子本身可能有10个文本域,但它们都应该一次性绘制)。
为了测试我的理解,如果您要使用10个JLabel而不是10个JTextField,则在按下“Load”后只执行一个绘制作业。它应该是什么。
此外,如果要保持JTextField不透明,则只执行一个绘制作业。 (刚刚测试过,如果使用JTextArea代替JTextField,则完成一次绘制)
发生了什么事?请注意,默认情况下JLabel是透明的,因此我不确定为什么JTextField组件的透明度会导致这些额外的绘制。
请帮助/