JLabel, GridLayout - PullRequest
       22

JLabel, GridLayout

1 голос
/ 23 августа 2011
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Gui extends JFrame
{
    private JFrame window = new JFrame();
    private JButton but[] = new JButton[9];

    public Gui()
    {
        window.setSize(300,400);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setLayout(new GridLayout(4, 3));

        JLabel txt = new JLabel("Will you dare?", JLabel.CENTER);
        txt.setLayout(new GridLayout(1, 1));
        txt.setHorizontalTextPosition(JLabel.CENTER);
        txt.setFont(new Font("Serif", Font.PLAIN, 21));
        window.add(txt);

        for(int i = 0; i < 9; i++)
        {
            but[i] = new JButton();
            window.add(but[i]);
        }  

        window.setVisible(true);

    }

    public void actionPerformed(ActionEvent e) 
    {

    }

}

Я Java noob, так что вы можете сказать мне, почему текст "Не посмеешь" не появится в одной строке? Можете ли вы рассказать мне, как вы нашли решение, так что в другой раз я тоже смогу сделать это сам.

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Дикая догадка, но я думаю, вы хотите что-то вроде:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Gui extends JFrame
{
    private JFrame window = new JFrame();
    private JButton but[] = new JButton[9];

    public Gui()
    {
        window.setSize(300,400);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        window.setLayout(new GridLayout(4, 3));
        JPanel panel = new JPanel( new GridLayout(3, 3) );
        window.add(panel, BorderLayout.CENTER);

        JLabel txt = new JLabel("Will you dare?", JLabel.CENTER);
//        txt.setLayout(new GridLayout(1, 1));
        txt.setHorizontalTextPosition(JLabel.CENTER);
        txt.setFont(new Font("Serif", Font.PLAIN, 21));
//        window.add(txt);
        window.add(txt, BorderLayout.NORTH);

        for(int i = 0; i < 9; i++)
        {
            but[i] = new JButton();
//            window.add(but[i]);
            panel.add(but[i]);
        }

        window.setVisible(true);

    }

    public static void main(String args[]) throws Exception
    {
        new Gui();
    }

}
2 голосов
/ 23 августа 2011

В вашем коде есть два предупреждения:

вы используете следующее выражение для добавления компонентов

 window.add(txt);
 //....
 window.add(but[i]);

оба вызова являются ярлыками для

window.getContentPane().add

и панель содержимого JFrame по умолчанию имеет BorderLayout.И по умолчанию этот макет будет добавлять компоненты в центральной области, если при добавлении не указана другая область / ограничение.Таким образом, вы просто размещаете компоненты один над другим, остается только последний.

Вы должны "вырезать" (плохой перевод, нарезать?) Больше вашего GUI, добавив JLabel в центре и добавив еще одну JPanel на юг, а внутри него используйте макет потока и добавьте свои кнопки.

Вот хорошее начало для использования упомянутой схемы, которая очень стандартна.

Также вы используете JLabel в качестве контейнера.Почти все компоненты Swing наследуются от java.awt.Container, это используется Swing для предоставления составных компонентов, но на самом деле, вы никогда не должны использовать их в качестве контейнера, то есть не помещать в них другие компоненты или давать им компоновку.Вы делаете это, задавая расположение в строке

txt.setLayout(new GridLayout(1, 1));

, поэтому удалите эту строку.Используйте компоненты Swing в качестве компонентов, а JPanel (или JTabbedPane и т. Д.) В качестве контейнеров.

С уважением, Стефан, никогда не задавайте значения жестко, используйте константы.Нет 9, но BUTTON_COUNT = 9 статический член.Вы могли бы рассмотреть вопрос о покупке книги Java.Раньше я рекомендовал Deitel и Deitel своим ученикам.

1 голос
/ 23 августа 2011

Проблема здесь довольно проста: Вы добавляете макет к своему ярлыку "txt".

Вы говорите, что метка "txt" должна занимать первую строку, первый столбец вашего JFrame. Первая строка, первый столбец приведет к появлению поля. Когда вы создаете такую ​​рамку, вам нужно убедиться, что она достаточно широка, чтобы текст полностью помещался на одной строке. В этом случае ваш текст просто переходит на следующую строку, потому что в этом «ящике» недостаточно места, чтобы весь ярлык поместился на одной строке.

Исправление проблемы:

  • Удалить эту строку: txt.setLayout(new GridLayout(1, 1));

OR

  • Измените следующую строку: txt.setLayout(new GridLayout(1, 1)); на txt.setLayout(new GridLayout(1,2));

У вас есть еще одна проблема, которую я заметил:

  • Следующая строка должна идти вверху, под private JButton but[] = new JButton[9]; : JLabel txt = new JLabel("Will you dare?");//Removing the 'JLabel.CENTER'

Это должно сделать это (я не думаю, что что-то пропустил). :)

...