在java swing中格式化框架

时间:2021-08-02 00:02:06

标签: java swing jframe

操作系统 - Windows 10 文本编辑器 - VSCode

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

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

我已经浏览了 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
        }
    }

}

2 个答案:

答案 0 :(得分:2)

白线是文本字段的Border

试试:

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

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

答案 1 :(得分:1)

对我来说,问题来自您创建的 JPanel (panel = new JPanel();) 以保存 JTextField

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

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

Example

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,有关更好的解决方案,请参阅 How to Use Swing Timers

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