gpt4 book ai didi

Java JSpinner 绘制两次

转载 作者:行者123 更新时间:2023-12-02 07:26:45 26 4
gpt4 key购买 nike

Quick picture to show what is happening

JSpinner 出现了两次,如上图所示。第一次出现在不应该出现的点 (0,0) 处的情况下,如果没有微调按钮,则无法选择、编辑或使用。

奇怪的是,其他所有组件都没有问题。只有jspinner。我正在使用 Java 7 并在 Netbeans(不是 gui 开发工具包)中进行开发。这是 java 7 的错误吗?如果不是,我可以尝试让 JSpinner 在我指定的区域仅绘制 1 次吗?

说明问题的代码:

我将其添加到 JPanel 的子类中,如下所示:

public class MyCustomGUI extends JPanel {
private JSpinner entrySpinner;
public MyCustomGUI () {
super(null);
this.setDoubleBuffered(true);

entrySpinner = new JSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1));
add(entrySpinner);
....

我有一个方法来给它一个位置:

public void resize() {
entrySpinner.setBounds((int) (this.getWidth() * .2), (int) (this.getHeight() * 0.38), (int) (this.getWidth() * 0.3), (int) (this.getHeight() * 0.1));
}

我在这里重写了绘制方法:

public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
.. draw shapes..
super.paintComponents(g);
super.validate();
Toolkit.getDefaultToolkit.sync();
g.dispose();
}

最佳答案

  1. 您调用了 paintComponent 两次,一次是在调用 super.paint 时调用,一次是手动调用
  2. 您从 paint 方法中调用 validate ,这只会导致组件开始重新绘制,一遍又一遍……说得好再见你的 CPU...
  3. 您正在处理不是您创建的图形上下文,这就像关闭您没有打开的文件一样。如果您没有创建它,则不应关闭它。
  4. 我不相信您需要调用 Toolkit.getDefaultToolkit.sync();,但我有理由相信您不应该在 中执行此操作>绘制方法
  5. 除非您有充分的理由这样做,否则您不应该重写 paint 方法。执行自定义绘制的推荐方法是 paintComponent 方法(由 paint 调用)

您可能想通读一下

用示例更新

帮我修好了...

enter image description here enter image description here

左边是你的代码,右边是我的

public class TestPaintSpinner {

public static void main(String[] args) {
new TestPaintSpinner();
}

public TestPaintSpinner() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

public TestPane() {
setDoubleBuffered(true);
setLayout(new GridBagLayout());
add(new JSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1)));

JPanel panel = new JPanel();
panel.add(new JLabel("Subpanel"));
add(panel);
}

// public void paint(Graphics g) {
// super.paint(g);
//
// Graphics2D g2d = (Graphics2D) g;
// Point2D sPoint = new Point2D.Float(0, 0);
// Point2D ePoint = new Point2D.Float(this.getWidth(), this.getHeight());
//
// g2d.setRenderingHint(
// RenderingHints.KEY_TEXT_ANTIALIASING,
// RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// super.paintComponents(g);
// super.validate();
// Toolkit.getDefaultToolkit().sync();
// g.dispose();
// }

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.

Graphics2D g2d = (Graphics2D) g;
Point2D sPoint = new Point2D.Float(0, 0);
Point2D ePoint = new Point2D.Float(this.getWidth(), this.getHeight());

// Note, this will effect every component painted after this one!!
g2d.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}
}
}

关于Java JSpinner 绘制两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13484376/

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