在 java swing 中格式化框架

Formatting a frame in java swing

OS - Windows 10 文本编辑器 - VSCode

在下面的程序中,我无法摆脱框架周围的白色轮廓。我有一个黑色桌面,并试图让应用程序融入 运行 作为一个小部件。然而,我一直无法在 swing 中找到任何似乎可以摆脱所讨论的白色轮廓的方法。

代码在下面,因此您可以 运行 它并查看我尝试过的内容,以及所有这些好东西。我已经注释掉了我正在试验的点点滴滴,看看是否会改变任何东西。 还有一个文本字段,它从我制作的另一个 class 文件中获取日期和时间输出,所以关于这个问题,请忽略它。除非以某种方式格式化文本字段可能会解决问题。

我浏览了 swing 提供的所有方法,但找不到似乎可以解决我的问题的方法。虽然我错过的几率是100%。

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

public class GUI implements GUIInterface{
    
    private JFrame frame;
    private JPanel panel;
    //private JLabel label;
    private JTextField txt;

    GUI(DateAndTime current){
        
        //label = new JLabel("Time");
        //label.setBounds(10,20,80,25);

        txt = new JTextField();
        txt.setEditable(false);
        txt.setBounds(0, 0, 130, 80);
        txt.setBackground(Color.BLACK);
        txt.setFont(new Font("Arial", Font.BOLD, 12));
        //txt.setOpaque(false);
        txt.setHorizontalAlignment(JTextField.CENTER);
        txt.setText(" " + current.toString() + " ");

        panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        panel.setLayout(new GridLayout());
               

        //panel.add(label);
        panel.add(txt);

        frame = new JFrame();
        //frame.setIconImage();
        frame.setUndecorated(true);
        frame.getContentPane().setForeground(Color.BLACK);
        frame.getContentPane().setBackground(Color.BLACK);
        //frame.setOpacity(0.95f);
        //frame.setBounds(200, 100, 120, 70);;
        //frame.setShape();
        //frame.setGlassPane(new Component() );
        //frame.setDefaultLookAndFeelDecorated(true);        
        frame.setMinimumSize(new Dimension(130, 80));
        frame.setMaximumSize(new Dimension(130, 80));
        frame.setResizable(false);    
        frame.setLocation(200,100);    
        //frame.setTitle("Time");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                       
        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);

        while(true){
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException ex)
            {
                break;
            }
            current.incSecond();
            System.out.print("\r                                          \r" + current.toString()); // outputs to command window
            txt.setText(" " + current.toString() + " ");  // outputs to GUI textField
        }
    }

}

白线是文本字段的Border

尝试:

txt.setBorder(new EmptyBorder(0, 0, 0, 0));

另外,不要使用 while (true) 循环。对于动画使用 Swing Timer.

对我来说,问题出在您创建的 JPanel (panel = new JPanel();) 中以容纳 JTextField

当 运行 在 MacOS 上时,字段周围有“空”space,“外观”使用它来提供关于哪个组件具有焦点的视觉线索(我是猜测)。

我通过将 panel 的背景颜色设置为 red...

进行了测试

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class GUI {

    private JFrame frame;
    private JPanel panel;
    //private JLabel label;
    private JTextField txt;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GUI();
            }
        });
    }

    GUI() {
        txt = new JTextField(8);
        txt.setEditable(false);
        txt.setBounds(0, 0, 130, 80);
        txt.setBackground(Color.BLACK);
        txt.setFont(new Font("Arial", Font.BOLD, 12));
        txt.setHorizontalAlignment(JTextField.CENTER);
        txt.setText(" Hello ");

        panel = new JPanel();
        panel.setBorder(new EmptyBorder(20, 20, 20, 20));
        panel.setLayout(new BorderLayout());

        panel.add(txt);

        frame = new JFrame();
//        frame.setUndecorated(true);
        frame.getContentPane().setForeground(Color.BLACK);
        frame.getContentPane().setBackground(Color.BLACK);
//        frame.setMinimumSize(new Dimension(130, 80));
//        frame.setMaximumSize(new Dimension(130, 80));
//        frame.setResizable(false);
        frame.setLocation(200, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel.setBackground(Color.RED);
        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);

//        while (true) {
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException ex) {
//                break;
//            }
//            current.incSecond();
//            System.out.print("\r                                          \r" + current.toString()); // outputs to command window
//            txt.setText(" " + current.toString() + " ");  // outputs to GUI textField
//        }
    }

}

Swing 也是单线程和 nit 线程安全的。这意味着你不应该在事件调度线程上执行任何长 运行 或阻塞操作,你不应该更新 UI (或 UI 依赖的任何状态)在事件调度线程的上下文之外。

请参阅 Concurrency in Swing for more details and How to Use Swing Timers 以获得更好的解决方案。

此外,作为旁注,在发布代码时,请尝试删除所有未用于演示问题的内容,这样会更容易 ;)