Java Grid Layout неправильный размер кнопки и неправильное расположение - PullRequest
0 голосов
/ 20 мая 2018

У меня проблема с Java-приложением Swing.

enter image description here

Мой код:

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 Delete \ n

Кнопка Token 2 Delete \ n

Кнопка Token 3 Delete \ n И так одна

И ятакже не могу изменить размер моих кнопок в другом JFrame:

enter image description here

Код:

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 Остановка при запуске в режиме онлайнКонсоль

Кнопки должны находиться рядом с строкой сервера.

Было бы неплохо, если бы кто-то мог помочь мне с моим кодом.

1 Ответ

0 голосов
/ 20 мая 2018
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:

строки - строки со значением ноль, означающим любое количество строк.

    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() );
    }
}
...