Сложности компонента Swing - PullRequest
1 голос
/ 19 декабря 2010

Я просто не могу заставить это работать вообще.Я пытаюсь заставить JTextField (input) передавать текст в JTextArea (reader), расположенную над ним при нажатии клавиши ввода, но они даже не отображаются в JFrame.Любые идеи, как я могу заставить этот фрагмент кода работать должным образом?Я, наверное, упускаю из виду очевидное.

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


public class Gui extends JPanel implements ActionListener{

    public static JTextField input;
    public JTextArea reader;


    public Gui() {

        //layout to be repeatedly used
        SpringLayout s_layout = new SpringLayout();

        //masterpanel, everything's on it
        JPanel all = new JPanel();
        all.setPreferredSize(new Dimension(600,400));
        all.setLayout(s_layout);

        //left jpanel - holds reader and input areas
        JPanel mainleft = new JPanel();
        mainleft.setPreferredSize(new Dimension(500,400));
        mainleft.setLayout(s_layout);
        //input textfield
        input = new JTextField(45);
        input.addActionListener(this);
        //reader textarea
        reader = new JTextArea();
        reader.setEditable(false);
        reader.setLineWrap(true);
        reader.setWrapStyleWord(true);
        JScrollPane reader_sp = new JScrollPane(reader);
        reader_sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        reader_sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        reader_sp.setPreferredSize(new Dimension(480,350));

        //set layout constraints for reader and input
        s_layout.putConstraint(SpringLayout.SOUTH, input,
                -10,
                SpringLayout.SOUTH, mainleft);

        s_layout.putConstraint(SpringLayout.NORTH, reader_sp,
                5,
                SpringLayout.NORTH, mainleft);

        //add all of the components to left panel
        mainleft.add(reader_sp);
        mainleft.add(input);

        //add left panel to masterpanel
        all.add(mainleft);

        //add masterpanel to jframe
        add(all);

    }

    public void actionPerformed(ActionEvent VK_ENTER) {

        //get the command from input area
        String text = input.getText();
        //append input to reader plus a new line
        reader.append(text + "\n");
        //clear input area
        input.setText("");
        //reset reader's caret position for next append
        reader.setCaretPosition(reader.getDocument().getLength());


    }


    private static void createAndShowGUI() {

        JFrame f = new JFrame("why doesn't this work?");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new Gui());
        f.pack();
        f.setLocationRelativeTo(null); //centers it
        f.setResizable(true);
        f.setVisible(true);

    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

Ответы [ 2 ]

3 голосов
/ 19 декабря 2010

Вы используете один и тот же объект макета для панели all и панели mainLeft.Удалите строку all.setLayout(s_layout) или mainleft.setLayout(s_layout) и посмотрите.

1 голос
/ 19 декабря 2010

Ваша проблема в LayoutManager или в ограничениях макета ... если вы, например, измените s_layout на FlowLayout, ваши компоненты будут отображаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...