gpt4 book ai didi

java - Swing 调整大小缓慢/跳跃

转载 作者:行者123 更新时间:2023-12-04 05:21:48 29 4
gpt4 key购买 nike

我用一个简单的渐变扩展了 JComponent 并调整了paintComponent()方法来制作我自己的BottomBar。

然后我将它添加到使用 BorderLayout 的 JFrame 的 SOUTH。

一开始一切看起来都是正确的。
当我调整框架的大小时,BottomBar 会重新绘制并正确设置到新位置。想法是,它晚了几毫秒,这样人们就可以看到 JFrame 的背景一秒钟。

有趣的是,当我将执行环境设置为 Java-SE 1.6 时,它可以工作......(而不是 1.7)
另外,我在 mac 上运行它,如果这有区别的话。

Screenshot comparing window when resized and when not

代码 - JButton 示例

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;


public class Main {

public static void main(String args[]){
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
JFrame frame = new JFrame("Resize Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JButton(), BorderLayout.SOUTH);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
});
}
}

代码 - 底部栏示例

主要:
public class Main {
public static void main(String args[]){
Frame window = new Frame();
window.setSize(500, 400);
window.setVisible(true);
}
}

框架:
import java.awt.BorderLayout;

import javax.swing.JFrame;


public class Frame extends JFrame{
private static final long serialVersionUID = 1L;

public Frame() {
setLayout( new BorderLayout() );
getContentPane().add( BorderLayout.SOUTH, new BottomBar() );
}
}

底部栏
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JComponent;

public class BottomBar extends JComponent {
private static final long serialVersionUID = 1L;

public BottomBar() {
setSize(200, 30);
setPreferredSize( new Dimension(200, 30) );
}

protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

GradientPaint gradient = new GradientPaint(0, 0, new Color(185, 185, 185), 0, getHeight() , new Color(151, 151, 151) );
g2.setPaint(gradient);
g2.fillRect(0, 0, getWidth(), getHeight());

g2.setColor( new Color(64, 64, 64) );
g2.drawLine(0, 0, getWidth(), 0);
g2.setColor( new Color(215, 215, 215) );
g2.drawLine(0, 1, getWidth(), 1);
}
}

最佳答案

我无法重现您在 1.6 中描述的效果;你可以试试 sscce下面 1.7。请注意,对于您的示例的一些建议:

  • 避免 setXxxxSize() ,如讨论 here .如果您只想要 SOUTH 中的 30 像素高条, 覆盖 getPreferredSize()如下图所示。如果您以后决定添加组件,则需要添加布局管理器。
    @Override
    public Dimension getPreferredSize() {
    return new Dimension(0, 30);
    }
  • 使用 pack()Window采用封闭组件的首选尺寸。我添加了任意大小 JPanelCENTER ;调整框架大小以查看条形如何在 SOUTH 中水平增长.
  • Swing GUI 对象只能在 event dispatch thread 上构建和操作。 .

  • BottomBar
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    /** @see https://stackoverflow.com/a/13610367/230513 */
    public class Main {

    public static void main(String args[]) {
    EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
    JFrame frame = new JFrame("BottomBar");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new JPanel() {

    @Override
    public Dimension getPreferredSize() {
    return new Dimension(320, 240);
    }
    }, BorderLayout.CENTER);
    frame.add(new BottomBar(), BorderLayout.SOUTH);
    frame.pack();
    frame.setLocationByPlatform(true);
    frame.setVisible(true);
    }
    });
    }

    private static class BottomBar extends JComponent {

    @Override
    public Dimension getPreferredSize() {
    return new Dimension(0, 30);
    }

    @Override
    protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);
    GradientPaint gradient = new GradientPaint(
    0, 0, new Color(185, 185, 185),
    0, getHeight(), new Color(151, 151, 151));
    g2.setPaint(gradient);
    g2.fillRect(0, 0, getWidth(), getHeight());
    g2.setColor(new Color(64, 64, 64));
    g2.drawLine(0, 0, getWidth(), 0);
    g2.setColor(new Color(215, 215, 215));
    g2.drawLine(0, 1, getWidth(), 1);
    }
    }
    }

    关于java - Swing 调整大小缓慢/跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607535/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com