在 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 以获得更好的解决方案。
此外,作为旁注,在发布代码时,请尝试删除所有未用于演示问题的内容,这样会更容易 ;)
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 以获得更好的解决方案。
此外,作为旁注,在发布代码时,请尝试删除所有未用于演示问题的内容,这样会更容易 ;)