Java 透明JPanel上的透明JTextField
不确定之前是否讨论过这个问题。但是我有一个奇怪的问题,在透明的JPanel上添加了透明的JTextFields。出于某种原因(我无法挖掘到足够的信息来找到原因),有更多的绘画被进行了。也许有一些肮脏的地区需要处理?不确定 让我举一个简单的例子:Java 透明JPanel上的透明JTextField,java,swing,jpanel,jtextfield,transparent,Java,Swing,Jpanel,Jtextfield,Transparent,不确定之前是否讨论过这个问题。但是我有一个奇怪的问题,在透明的JPanel上添加了透明的JTextFields。出于某种原因(我无法挖掘到足够的信息来找到原因),有更多的绘画被进行了。也许有一些肮脏的地区需要处理?不确定 让我举一个简单的例子: public class TextFieldGame extends JPanel { public static void main(String [] args){ SwingUtilities.invokeLater(n
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);
}
}
}
公共类TextFieldGame扩展了JPanel{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame someFrame=newjframe(“这很奇怪吗?”);
someFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
someFrame.setSize(200600);
添加(新的TextFieldGame());
someFrame.setVisible(true);
}
});
}
公共文本场游戏(){
setupContentPane();
}
私有void setupContentPane(){
setLayout(新的BorderLayout());
最终CanvasPanel CanvasPanel=新CanvasPanel();
添加(canvasPanel,BorderLayout.CENTER);
添加(新控制面板(canvasPanel),BorderLayout.SOUTH);
}
公共静态类控制面板扩展了JPanel{
私人最后拉票小组;
控制面板(CanvasPanel CanvasPanel){
this.canvasPanel=canvasPanel;
setupContentPane();
}
私有void setupContentPane(){
setLayout(新的FlowLayout(FlowLayout.RIGHT));
最终JButton载荷=新JButton(“载荷”);
添加(加载);
load.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
canvasPanel.addChildComponent(getComponent());
canvasPanel.revalidate();
canvasPanel.repaint();
}
});
}
私有JComponent getComponent(){
最终JPanel容器=新JPanel();
container.setLayout(新的BoxLayout(container,BoxLayout.PAGE_轴));
container.set不透明(false);
对于(int i=0;i<10;i++){
最终JTextField textField=新的JTextField(“为什么你没有工作?”){
@凌驾
公共维度getMaximumSize(){
返回新尺寸(Short.MAX_值,getPreferredSize().height);
}
};
textField.set不透明(false);
container.add(textField);
}
返回容器;
}
}
公共静态类CanvasPanel扩展了JPanel{
私有int paintCount=0;
游说小组(){
setupContentPane();
}
公共void setupContentPane(){
setLayout(新的BoxLayout(这是BoxLayout.PAGE_轴));
挫折地面(颜色:白色);
}
public void addChildComponent(JComponent组件){
组件设置对齐Y(顶部对齐);
添加(组件);
}
@凌驾
受保护组件(图形g){
超级组件(g);
System.out.println(“油漆计数:+++油漆计数);
}
}
}
我添加了System out语句以显示绘制任务的计数
首次装载时,将有2/3的油漆-足够公平。然后,如果要按“加载”按钮,10个透明的JTextFields将添加到一个透明的JPanel中,这个透明的JPanel将添加到CanvasPanel中。(Canvas panel又是JFrame的子部分)。您会注意到,完成此操作后,将完成11个额外的喷漆作业
但在理论上(我的理解是),按下“加载”按钮后,只能进行一次喷漆作业。这是因为,我只在CanvasPanel中添加了一个子项(这个子项本身可能有10个文本字段,但它们应该一次全部绘制)
为了验证我的理解,如果要使用10个jlabel而不是10个JTextFields,则在按下“Load”后只执行一个绘制作业。应该是这样的
此外,如果要保持JTextField不透明,则只执行一次绘制作业。(刚刚测试过,如果使用JTextArea代替JTextField,则完成一次喷漆)
发生了什么事?请注意,JLabel在默认情况下是透明的,所以我不确定为什么JTextField组件的透明度会导致这些额外的绘制
请帮忙/你为什么认为你在乎有多少油漆?一般来说,你无法控制这个数字。只是猜测,但可能透明组件会导致更多的绘制,因为它们后面的组件也必须绘制?为什么要计算组件绘制的次数?这是不必要的。JTextField需要支持闪烁插入符号。也许这就是区别。只要画的是正确的,这就没什么好担心的。还有一些其他的画的任务我需要执行,它们在每次刷新包含面板时都会执行。因此,这些额外的喷漆实际上会导致性能问题。请注意,这是我正在处理的一个更大应用程序的简单模拟示例。也许使用JTextfield来做我正在做的事情是不合适的。我可能应该使用JLabel,毕竟,我实际上是在将所有文本字段的编辑设置为false(而不是在模拟中)(顺便说一句,闪烁的光标不会显示在不可编辑的文本字段上,但它仍然会额外绘制它)好吧,就像我们所说的,您实际上无法控制绘制。事实上,在不同的计算机、操作系统、JRE版本上,甚至在同一台计算机上的不同时间,您可能会得到完全不同的数字,这取决于其他情况。如果绘制代码的调用相差10次会导致性能问题,那么您将面临更大的问题