JTextField - метод setColumns () не работает для меня - PullRequest
4 голосов
/ 17 января 2012

Моя проблема в том, что мой JTextField -setColumns (int)

"field1.setColumns (5);"

... не работает.Я предполагаю, что это проблема менеджера компоновки.Тем не менее, я учусь из тетради.Единственные известные мне макеты - это flowLayout, borderLayout и gridlayout.

Чтобы кратко объяснить этот код, всякий раз, когда «field2» запускает ActionEvent (нажатием клавиши ввода), «field1» должен изменять размер.

Я поместил «System.out.println (« Обнаружен ActionEvent ») в« actionPerformed », чтобы доказать, что actionevent запускается, так что это не проблема. Я даже напечатал»field1.getColumn ", и он показывает правильное измененное значение 5, однако ... Его размер не просто заметно не изменяется во время выполнения.

Вместо того, чтобы обойтись, я надеялся, что кто-то может объяснить проблему. РаботаВсе вокруг не поможет мне учиться, и в этом вся цель этих книжных упражнений.

Если это важно, я пишу в NetBeans. Заранее спасибо за помощь.

public class Exercise13_11 extends JFrame implements ActionListener
{
    private JTextField textField1, textField2;
    private JLabel label1, label2;
    private JRadioButton rButton1, rButton2, rButton3;

    public static void main(String[] args)
    {
        JFrame frame = new Exercise13_11();
        frame.setTitle("Exercise 13.11");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(450, 200);
        frame.setVisible(true);
    }

public Exercise13_11()
{
    // North Panel aligned and filled.
    JPanel northPanel = new JPanel();
    northPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    northPanel.add(label1 = new JLabel("Text Field"));
    northPanel.add(textField1 = new JTextField(20));
    northPanel.setToolTipText("Demonstrate JTextField");
    getContentPane().add(northPanel, BorderLayout.CENTER);

    // South panel now being filled...
    JPanel southPanel = new JPanel();
        southPanel.setLayout(new FlowLayout());

    JPanel alignmentPanel = new JPanel();
    alignmentPanel.setBorder(
                new javax.swing.border.TitledBorder("Horizontal Alignment"));
    alignmentPanel.add(rButton1 = new JRadioButton("Left"));
    alignmentPanel.add(rButton2 = new JRadioButton("Center"));
    alignmentPanel.add(rButton3 = new JRadioButton("Right"));

    ButtonGroup buttonGroup = new ButtonGroup();
    buttonGroup.add(rButton1);
    buttonGroup.add(rButton2);
    buttonGroup.add(rButton3);

    JPanel columnPanel = new JPanel();
    columnPanel.setBorder(new javax.swing.border.EtchedBorder());
    columnPanel.setLayout(new FlowLayout());
    columnPanel.add(label2 = new JLabel("Column Size"));
    columnPanel.add(textField2 = new JTextField(10));

    southPanel.add(alignmentPanel);
    southPanel.add(columnPanel);
    getContentPane().add(southPanel, BorderLayout.SOUTH);

    textField1.addActionListener(this);
    rButton1.addActionListener(this);
    rButton2.addActionListener(this);
    rButton3.addActionListener(this);        
}

public void actionPerformed(ActionEvent e)
{
    if (e.getSource() == textField1)
    {
        textField1.setColumns(5);
    }
    else if (e.getSource() == rButton1)
            textField1.setHorizontalAlignment(textField1.LEFT);
    else if (e.getSource() == rButton2)
            textField1.setHorizontalAlignment(textField1.CENTER);
    else if (e.getSource() == rButton3)
            textField1.setHorizontalAlignment(textField1.RIGHT);
 }

}

Ответы [ 2 ]

5 голосов
/ 17 января 2012

Это работает, вам просто нужно заставить контейнер снова разметить его компоненты.Это может быть достигнуто путем вызова revalidate и последующего запроса repaint (для удаления любых визуальных артефактов).

0 голосов
/ 02 февраля 2019

Метод .setColumns() (используется с компонентом JFormattedTextField) не сработал из-за использования TitledBorder для контейнера, в который был помещен JFormattedTextFields:

<container.setBorder(javax.swing.BorderFactory.createTitledBorder("central"));>
...