java - Java Grid Layout错误的按钮大小和错误的位置
问题描述
我遇到了 Java Swing 应用程序的问题。
我的代码:
public class AdminToken extends JFrame {
VirtualServer server;
@Override
public Container getContentPane() {
return super.getContentPane();
}
public AdminToken(VirtualServer server)
{
this.server = server;
getContentPane().setLayout(null);
setupGUI();
setLayout(new GridLayout(5,1));
}
void setupGUI()
{
setTitle("Token Management Server: " + server.getName() );
setSize(576,528);
setVisible(true);
setResizable(true);
final JPanel panel = new JPanel();
panel.setLayout(new GridLayout(5,1));
LoginForm.api.selectVirtualServer(server);
for( final PrivilegeKey tokens : LoginForm.api.getPrivilegeKeys()) {
final JLabel label = new JLabel(tokens.getToken() + " " + tokens.getGroupId() + " " + "\n");
panel.add(label);
JButton button = new JButton("Löschen");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
LoginForm.api.deletePrivilegeKey(tokens.getToken());
panel.remove(label);
panel.repaint();
}
});
button.setVisible(true);
button.setPreferredSize(new Dimension(87,25));
panel.add(button);
}
JScrollPane scrollPane = new JScrollPane (panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
add(scrollPane);
LoginForm.api.selectVirtualServerById(LoginForm.vServerId);
}
令牌应显示如下:
Token1 按钮删除\n
令牌 2 按钮删除\n
令牌 3 按钮删除 \n 等等
而且我也无法在另一个 JFrame 中更改按钮的大小:
编码:
public class TsServerOverview extends JFrame {
@Override
public Container getContentPane() {
return super.getContentPane();
}
public TsServerOverview()
{
getContentPane().setLayout(null);
setupGUI();
setLayout(new GridLayout());
}
void setupGUI()
{
setTitle("Ts3Query Server Oveview");
setSize(576,528);
setVisible(true);
setResizable(true);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(5,2));
for( final VirtualServer servers : LoginForm.api.getVirtualServers()) {
final int id = servers.getId();
panel.add(new JLabel(servers.getId() + " " + servers.getName() + " " + servers.getClientsOnline() + "/" + servers.getMaxClients() + "\n"));
JButton button = new JButton("Konsole öffnen");
JButton showchannels = new JButton("Channel-Liste");
JButton tokenmanagement = new JButton("Token Management");
showchannels.setPreferredSize(new Dimension(10,10));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new GUIConsole(servers);
}
});
showchannels.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new ChannelList(servers);
}
});
tokenmanagement.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new AdminToken(servers);
}
});
tokenmanagement.setVisible(true);
button.setVisible(true);
showchannels.setVisible(true);
panel.add(showchannels);
panel.add(button);
panel.add(tokenmanagement);
}
JScrollPane scrollPane = new JScrollPane (panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
add(scrollPane);
}
这也应该像这样显示:
Server1 3/32 联机启动停止控制台\n
Server2 3/32 离线启动停止控制台\n
Server3 3/32 在线启动停止控制台
按钮应该在服务器线旁边。
如果有人可以帮助我编写代码,那就太好了。
解决方案
public class AdminToken extends JFrame {
VirtualServer server;
@Override
public Container getContentPane() {
return super.getContentPane();
}
删除不需要证明问题的所有内容。那包含着VirtualServer
public AdminToken(VirtualServer server)
{
this.server = server;
getContentPane().setLayout(null);
setupGUI();
setLayout(new GridLayout(5,1));
}
getContentPane().setLayout
并且setLayout
本质上是一样的。设置两次没有用。避免空布局管理器。
void setupGUI()
{
setTitle("Token Management Server: " + server.getName() );
setSize(576,528);
setVisible(true);
setResizable(true);
setTitle
不需要证明这个问题。无需设置大小。在适用时设置首选尺寸并让布局管理器进行布局。setResizable(true)
是默认值。这同样适用于button.setVisible(true);
你通常想要setVisible(true);
的最后。
final JPanel panel = new JPanel();
panel.setLayout(new GridLayout(5,1));
通过new GridLayout(5,1)
您将网格设置为 5 行。如果你添加更多它会弄乱布局。来自java文档:
rows - 行,零值表示任意数量的行。
LoginForm.api.selectVirtualServer(server);
for( final PrivilegeKey tokens : LoginForm.api.getPrivilegeKeys()) {
final JLabel label = new JLabel(tokens.getToken() + " " + tokens.getGroupId() + " " + "\n");
panel.add(label);
JButton button = new JButton("Löschen");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
LoginForm.api.deletePrivilegeKey(tokens.getToken());
panel.remove(label);
panel.repaint();
}
});
button.setVisible(true);
button.setPreferredSize(new Dimension(87,25));
panel.add(button);
}
JScrollPane scrollPane = new JScrollPane (panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
add(scrollPane);
LoginForm.api.selectVirtualServerById(LoginForm.vServerId);
}
这是mcve展示了我认为您要实现的目标:
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class AdminToken extends JFrame {
public AdminToken()
{
setupGUI();
setVisible(true);
setResizable(true);
pack();
}
void setupGUI() {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0,2));
for(int row =0; row < 6; row++ ) {
panel.add(new JLabel("Label "+row));
panel.add(new JButton("Delete"));
}
JScrollPane scrollPane = new JScrollPane (panel);
add(scrollPane);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new AdminToken() );
}
}
推荐阅读
- bash - Git Bash 的问题
- python - Scrapy:是否可以在蜘蛛完成后比较所有项目?
- javascript - 事件执行顺序和渲染
- ubuntu - 如何在 Google Colab 上安装 Cytoscape?
- jquery - 为什么 hide() 没有隐藏元素?
- javascript - 当我将主页属性添加到 github 页面的包 json 时,React 路由器不显示“/”作为主页
- java - JNA 查找窗口,但未将其最小化
- random - 约束条件更改时的系统verilog randc行为
- python - .readlines 在 python 3 中似乎根本不起作用
- sql - 在 Go 中将 sqlx.DB 转换为 sql.DB