当前位置: 首页 > 知识库问答 >
问题:

Java中GUI编程的怪异问题

夏宏旷
2023-03-14

下面是我的代码:

package javaapplication13;

import java.awt.*;
import javax.swing.*;

public class JavaApplication13 {
    public static void main(String[] args) {
        ButtonFrame bf = new ButtonFrame();
    }
}

class ButtonFrame extends JFrame {
    public ButtonFrame() {
        JButton b1 = new JButton("1. Dugme");
        JButton b2 = new JButton("2. Dugme");
        JLabel l1 = new JLabel();
        JCheckBox c1 = new JCheckBox("Prvo dugme");
        JCheckBox c2 = new JCheckBox("Drugo dugme");
        Container cp = getContentPane();
        setTitle("Dugme");
        setSize(400,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        this.add(b1);
        this.add(b2);
        this.add(c1);
        this.add(c2);
        this.add(l1);
        b1.setBounds(20, 30, 90, 20);
        b2.setBounds(20,70,90,20);
        l1.setBounds(70,120,90,20);
        c1.setBounds(120,30,120,20);
        c2.setBounds(120,70,120,20);

        l1.setText("");
    }
}

共有1个答案

郎宏逸
2023-03-14

当我用JDK17在我的Windows10计算机上复制和运行您的代码时,我没有看到您声称得到的闪烁。然而,当我更改代码并在添加按钮和复选框之前将标签添加到框架中时(正如您在问题中所述),我确实看到了“闪烁”。

虽然您已经接受@Antoniossss的回答,但不建议不使用布局管理器。请参考以下摘录自没有布局管理器的情况下

尽管没有布局管理器也是可能的,但如果可能的话,您应该使用布局管理器。

import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class BtnFrame {
    private void createAndDisplayGui() {
        JFrame frame = new JFrame("Dugme");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridBagLayout());
        createForm(frame.getContentPane());
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void createForm(Container contentPane) {
        if (contentPane instanceof JComponent) {
            JComponent jCmpt = (JComponent) contentPane;
            jCmpt.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        }
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets.bottom = 5;
        gbc.insets.left = 5;
        gbc.insets.right = 5;
        gbc.insets.top = 5;
        JButton b1 = new JButton("1. Dugme");
        contentPane.add(b1, gbc);
        gbc.gridx = 1;
        JCheckBox c1 = new JCheckBox("Prvo dugme");
        contentPane.add(c1, gbc);
        gbc.gridx = 0;
        gbc.gridy = 1;
        JButton b2 = new JButton("2. Dugme");
        contentPane.add(b2, gbc);
        gbc.gridx = 1;
        JCheckBox c2 = new JCheckBox("Drugo dugme");
        contentPane.add(c2, gbc);
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.anchor = GridBagConstraints.CENTER;
        JLabel l1 = new JLabel("label");
        contentPane.add(l1, gbc);
    }

    public static void main(String[] args) {
        final BtnFrame gui = new BtnFrame();
        EventQueue.invokeLater(() -> gui.createAndDisplayGui());
    }
}
import java.awt.Container;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ButtonFrame extends JFrame {
    public ButtonFrame(){
        
        JButton b1 = new JButton("1. Dugme");
        JButton b2 = new JButton("2. Dugme");
        JLabel l1 = new JLabel();
        JCheckBox c1 = new JCheckBox("Prvo dugme");
        JCheckBox c2 = new JCheckBox("Drugo dugme");
        Container cp = getContentPane();
        cp.setLayout(null); // Added this line.
        setTitle("Dugme");
        setSize(400,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        this.add(l1);
        this.add(b1);
        this.add(b2);
        this.add(c1);
        this.add(c2);
//        this.add(l1);
        b1.setBounds(20, 30, 90, 20);
        b2.setBounds(20,70,90,20);
        l1.setBounds(70,120,90,20);
        c1.setBounds(120,30,120,20);
        c2.setBounds(120,70,120,20);
        
        l1.setText("label");
    }

    public static void main(String[] args) {
        ButtonFrame bf = new ButtonFrame();
    }
}
 类似资料:
  • 问题内容: 我想知道是否有关于使用Java进行声明性GUI编程的建议。(我讨厌基于视觉的GUI创建者/编辑器软件,但是对手动实例化JPanels和Boxes以及JLabel和JLists等感到有点厌倦。) 这是我的总体问题,但是对于我正在考虑采用的方法,我有两个具体问题: JavaFX:在JavaFX中是否有一个实际的GUI显示示例(例如,不是圆形和矩形,而是列表框,按钮和标签等),可以与访问和更

  • 问题内容: 我的JDBC代码有问题。我正在尝试通过MySQL连接,但它给了我一个错误。如果您有时间,下面会给出我的错误日志。 我的代码如下。我正在使用驱动程序: 问题答案: 当您使用Eclipse作为IDE并尝试运行甚至无法编译的代码时,都会发生此错误。在Eclipse中检查“ 问题” 视图,并在执行应用程序之前修复编译错误。

  • 本文向大家介绍java必学必会之GUI编程,包括了java必学必会之GUI编程的使用技巧和注意事项,需要的朋友参考一下 一、事件监听 测试代码一: 测试代码二: 二、TextField事件监听 测试代码: 使用TextField类实现简单的计算器 JAVA里面的经典用法:在一个类里面持有另外一个类的引用 运行结果如下: 三、内部类 内部类的使用范例: 内部类带来的巨大好处是: 可以很方便地访问外部

  • 我的JDBC代码有一些问题。我正在尝试通过MySQL连接,但它给我一个错误。如果您有时间,我的错误日志如下所示。 我的代码如下。我正在使用驱动程序:

  • 问题内容: 我将如何以编程方式单击Swing JButton,该方式将注册所有相关的动作/鼠标事件并且对用户可见(即,他们将看到按下的按钮就好像他们实际单击了按钮一样)? 该按钮位于我正在运行的同一应用程序中;我不是要控制另一个应用程序中的按钮。我想我可以将事件直接注入到队列中,但是如果可能的话,我宁愿避免这种方法,并且这样做不会显示可见的点击。 我看到java.awt.Robot类提供了移动鼠标

  • 我发现 await 并没有用 update_product_loop 还是立刻就执行力,那 await 和 async 的到底是什么含义,以及我要怎么才能做到真正的等 异步任务 a 完成再去其它呢,就是说 a 里有很多子任务是异步的