为什么在Java中隐藏JButton边框时文本会消失?
我正在为两个角色制作一个圆形轨迹的GUI。我已经使用按钮数组构建了它,但一旦我设置:为什么在Java中隐藏JButton边框时文本会消失?,java,macos,text,border,jbutton,Java,Macos,Text,Border,Jbutton,我正在为两个角色制作一个圆形轨迹的GUI。我已经使用按钮数组构建了它,但一旦我设置: trackButtons[i].setBorderPainted(false); 无论我设置的大小,文本都会消失。注释掉这一行可以再次显示文本,但很明显,边框会显示出来,按钮也会像按钮一样出现。有没有办法隐藏按钮的边框,但允许显示文本 main.java: import javax.swing.JFrame; public class main { public static void main(St
trackButtons[i].setBorderPainted(false);
无论我设置的大小,文本都会消失。注释掉这一行可以再次显示文本,但很明显,边框会显示出来,按钮也会像按钮一样出现。有没有办法隐藏按钮的边框,但允许显示文本
main.java:
import javax.swing.JFrame;
public class main
{
public static void main(String[] args)
{
UserFrame myFrame = new UserFrame();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setSize(600,460);
myFrame.setVisible(true);
myFrame.setResizable(false);
}//End of main
}//End of class main
UserFrame.java:
import javax.swing.*;
import java.awt.BorderLayout; //Needed for Border Layout
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Color; //Needed for BLING!
import java.awt.Font;
import java.awt.Dimension; //Needed for Button Dimensions
public class UserFrame extends JFrame
{
//Variables
private JLabel messageBox;
//Layouts
private JPanel northPanel;
private JPanel eastPanel;
private JPanel southPanel;
private JPanel westPanel;
private JPanel controlPanel; //Contains all buttons and what not.
// Board Pieces Grid
private JButton[] trackButtons; //Ring of buttons forming track.
//Game Functions
private GameFunc gameFunctions;
//Constructor
public UserFrame()
{
//Construct GUI
super("Tortoise and Hare Race");
setLayout(new BorderLayout());
//Variables
Color myGreen = new Color(70, 190, 102);
Font myFont = new Font("Arial", Font.PLAIN, 8);
//Set size of Button Array
trackButtons = new JButton[100];
northPanel = new JPanel();
eastPanel = new JPanel();
southPanel = new JPanel();
westPanel = new JPanel();
//Set Layout
northPanel.setLayout(new BoxLayout(northPanel, BoxLayout.LINE_AXIS));
eastPanel.setLayout(new BoxLayout(eastPanel, BoxLayout.PAGE_AXIS));
southPanel.setLayout(new BoxLayout(southPanel, BoxLayout.LINE_AXIS));
westPanel.setLayout(new BoxLayout(westPanel, BoxLayout.PAGE_AXIS));
for(int i=0; i<50; i++)
{
trackButtons[i] = new JButton();
trackButtons[i].setMinimumSize(new Dimension(20, 20));
trackButtons[i].setPreferredSize(new Dimension(20, 20));
trackButtons[i].setMaximumSize(new Dimension(20, 20));
trackButtons[i].setSize(20,20);
trackButtons[i].setMargin(new Insets(0,0,0,0));
trackButtons[i].setBackground(myGreen);
trackButtons[i].setOpaque(true);
trackButtons[i].setBorderPainted(false);
trackButtons[i].setFont(myFont);
//DEBUG
trackButtons[i].setText(""+i);
if(i<30)
northPanel.add(trackButtons[i]);
else if(i<50)
eastPanel.add(trackButtons[i]);
}
//Flip count for south and west panel to maintain order!
for(int i=99; i>=50; i--)
{
trackButtons[i] = new JButton();
trackButtons[i].setMinimumSize(new Dimension(20, 20));
trackButtons[i].setPreferredSize(new Dimension(20, 20));
trackButtons[i].setMaximumSize(new Dimension(20, 20));
trackButtons[i].setMargin(new Insets(0,0,0,0));
trackButtons[i].setBackground(myGreen);
trackButtons[i].setOpaque(true);
trackButtons[i].setBorderPainted(false);
trackButtons[i].setFont(myFont);
//DEBUG
trackButtons[i].setText(""+i);
if(i>=80)
westPanel.add(trackButtons[i]);
else if(i>=50)
southPanel.add(trackButtons[i]);
}
//Add Panels to respective locations
add(BorderLayout.NORTH, northPanel);
add(BorderLayout.EAST, eastPanel);
add(BorderLayout.SOUTH, southPanel);
add(BorderLayout.WEST, westPanel);
}//End of constructor method
}//End of userFrame class
import javax.swing.*;
导入java.awt.BorderLayout//需要边界布局
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.Insets;
导入java.awt.Color//需要珠宝!
导入java.awt.Font;
导入java.awt.Dimension//需要按钮尺寸
公共类UserFrame扩展了JFrame
{
//变数
专用JLabel消息框;
//布局
私人JPanel northPanel;
私人JPanel eastPanel;
私人JPanel southPanel;
私人JPanel westPanel;
private JPanel Control Panel;//包含所有按钮以及其他按钮。
//板件网格
私有JButton[]轨迹按钮;//形成轨迹的按钮环。
//游戏功能
私有GameFunc游戏功能;
//建造师
公共用户框架()
{
//构造图形用户界面
超级(“龟兔赛跑”);
setLayout(新的BorderLayout());
//变数
颜色myGreen=新颜色(70、190、102);
Font myFont=新字体(“Arial”,Font.PLAIN,8);
//设置按钮数组的大小
trackButtons=新的JButton[100];
northPanel=新的JPanel();
eastPanel=新的JPanel();
southPanel=newjpanel();
westPanel=新JPanel();
//集合布局
northPanel.setLayout(新的BoxLayout(northPanel,BoxLayout.LINE_轴));
eastPanel.setLayout(新的BoxLayout(eastPanel,BoxLayout.PAGE_轴));
southPanel.setLayout(新的BoxLayout(southPanel,BoxLayout.LINE_轴));
westPanel.setLayout(新的BoxLayout(westPanel,BoxLayout.PAGE_轴));
对于(int i=0;i=50)
添加(轨迹按钮[i]);
}
//将面板添加到相应的位置
添加(BorderLayout.NORTH,northPanel);
添加(BorderLayout.EAST,eastPanel);
添加(BorderLayout.SOUTH、southPanel);
添加(BorderLayout.WEST,westPanel);
}//构造函数结束方法
}//userFrame类的结尾
提前谢谢
编辑:我在Mac电脑上,是不是Java做了一些操作系统特有的时髦事?这是一个我在mac上玩了一会儿,看到了与您看到的完全相同的问题 Swing很敏感——在PC上这一切都很好(尽管按钮大小有点错误) 我确实让它起作用了——有点。尝试使用JLabel而不是JButton(唯一的其他更改是注释掉对setMargin的调用,并将horizontalTextAlignment设置为CENTER)
我仍然说,一般来说,在对swing进行故障排除时,首先要做的事情始终是确保它处于正确的线程中,但它很少有帮助——只是当它确实有帮助时,它会修复最奇怪的问题…当我尝试一些代码时,JButton的文本会显示出来,因此问题可能与尚未显示的因素有关建议您考虑创建并发布一个小的可编译和可运行的程序来演示您的问题,AN(请检查链接以获得更多的细节)。我添加了更多的代码。除了我的按钮处理程序(尚未实现的注释外块)之外,这就是一切。。仍然没有为我显示。它显示的每个按钮上都没有显示数字。我仍然看到按钮的数字。也许这是外观或平台特定的,我真的说不出来。你使用的是哪个操作系统?这是我看到的一个例子。有机会我会在PC上尝试。我不认为这会成为任何wa中的Swing线程问题y、 形状或样式。如果有帮助,此代码来自扩展JFrame的UserFrame对象。然后从我的主文件中构造一个UserFrame类型的对象,将其设置为在主文件中可见是我设置窗口尺寸并将resize设置为false后的最后一个命令。@Hovercraft Java建议不要在swing线程之外执行任何操作还有——以前只是在GUI实现之前,但现在你甚至不应该在主线程中创建框架——他们仍然声称它“基本上是安全的”在框架实现之前使用主线程。当在不同平台上发生不同的奇怪事情时,它有时可能是原因,所以我通常尝试将其作为变量消除。