简体   繁体   中英

JScrollpane on JPanel doesn't work

I am trying to add jscrollpane on my jframe through the jpanel but it doesn't work. The problem is that if i dont add a scroll bar and the string i want to display on the frame is too long, it won't be displayed and will be cut off.However, when i add the scrollpane the jframe doesn't display the string at all.To "draw" the string on the window, i am using setText(). This is my code:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.net.*;
import javax.swing.border.LineBorder;

public class LabelFrame extends JFrame {
    private final JTextField urlString; 
    private final JButton loadButton;
    String content;
    JTextArea textArea = new JTextArea();

    public LabelFrame() { 
        super("WebStalker"); 
        setSize(600, 600);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
         });
        setLayout(new FlowLayout());

        urlString = new JTextField("https:Search",30);
        loadButton = new JButton("Load");


        JPanel panel = new JPanel();
        JLabel label = new JLabel("URL");
        panel.add(label);
        panel.add(urlString);
        panel.add(loadButton);

        JScrollPane jp = new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        panel.add(jp);
        this.add(panel);

        pack(); // JFrame στο ελάχιστο μέγεθος με όλα τα περιεχόμενα
        setLocationRelativeTo(null); //τοποθετεί στο κέντρο το παράθυρο

        TextFieldHandler tHandler = new TextFieldHandler();
        ButtonHandler bHandler = new ButtonHandler(); 

        urlString.addActionListener(tHandler);
        loadButton.addActionListener(bHandler);

        urlString.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e){
                urlString.setText("");
            }
        });

    }

    private class TextFieldHandler implements ActionListener {
        @Override
         public void actionPerformed(ActionEvent event){ 
             try {
                 content = URLReaderFinal.Reading(event.getActionCommand());

                 textArea.setText(content);
                 textArea.setWrapStyleWord(true);
                 textArea.setLineWrap(true);
                 textArea.setOpaque(false);
                 textArea.setEditable(false);
                 textArea.setFocusable(false);
                 textArea.setBackgroung(UIManager.getColor("Label.background");                             
                 textArea.setFont(UIManager.getFont("Label.font"));
                 textArea.setBorder(UIManager.getBorder("Label.border"));
                 getContentPane().add(textArea, BorderLayout.CENTER);
          }
          catch(Exception e) {
              JOptionPane.showMessageDialog(null, "This url doesnt exist","Error", JOptionPane.ERROR_MESSAGE);
          }


         }
    }

     private class ButtonHandler implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent event) {
             try {
                 content = URLReaderFinal.Reading(urlString.getText());
                 textArea.setText(content);
                 textArea.setWrapStyleWord(true);
                 textArea.setLineWrap(true);
                 textArea.setOpaque(false);
                 textArea.setEditable(false);
                 textArea.setFocusable(false);
                 textArea.setBackground(UIManager.getColor("Label.background"));
                 textArea.setFont(UIManager.getFont("Label.font"));
                 textArea.setBorder(UIManager.getBorder("Label.border"));
                 getContentPane().add(textArea, BorderLayout.CENTER);
             } catch (Exception e) {
                 System.out.println("Unable to load page");
                 JOptionPane.showMessageDialog(null, "Unable to load page","Error", JOptionPane.ERROR_MESSAGE);
             }
     }
 }

}

In your button handlers you are re-adding a JTextArea to the GUI without its JScrollPane:

getContentPane().add(textArea, BorderLayout.CENTER);

which is essentially removing it from the JScrollPane just when you need it inside of it -- don't do that as this will totally mess you up and will remove the JScrollPane from view. Instead leave the JTextArea where it is, don't try to re-add components to your JFrame's contentPane, and simply add text to the JTextArea as needed.

Also, don't forget to give your JTextArea column and row properties, something that can easily be done by using the constructor that takes two ints. And leave the contentPane's layout as BorderLayout:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.net.*;
import javax.swing.border.LineBorder;

@SuppressWarnings("serial")
public class LabelFrame extends JFrame {
    private static final int ROWS = 30;
    private static final int COLS = 80;
    private final JTextField urlString;
    private final JButton loadButton;
    String content;
    JTextArea textArea = new JTextArea(ROWS, COLS);

    public LabelFrame() {
        super("WebStalker");
        // setSize(600, 600);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // setLayout(new FlowLayout()); // !! no
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        textArea.setOpaque(false);
        textArea.setEditable(false);
        textArea.setFocusable(false);
        textArea.setBackground(UIManager.getColor("Label.background"));
        textArea.setFont(UIManager.getFont("Label.font"));
        textArea.setBorder(UIManager.getBorder("Label.border"));

        urlString = new JTextField("https:Search", 30);
        loadButton = new JButton("Load");

        JPanel panel = new JPanel();
        JLabel label = new JLabel("URL");
        panel.add(label);
        panel.add(urlString);
        panel.add(loadButton);

        JScrollPane jp = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        // panel.add(jp);
        this.add(panel, BorderLayout.PAGE_START);
        add(jp);

        pack(); // JFrame στο ελάχιστο μέγεθος με όλα τα περιεχόμενα
        setLocationRelativeTo(null); // τοποθετεί στο κέντρο το παράθυρο

        TextFieldHandler tHandler = new TextFieldHandler();
        ButtonHandler bHandler = new ButtonHandler();

        urlString.addActionListener(tHandler);
        loadButton.addActionListener(bHandler);

        urlString.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                urlString.setText("");
            }
        });

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new LabelFrame().setVisible(true);
        });
    }

    private class TextFieldHandler implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent event) {
            try {
                content = URLReaderFinal.Reading(event.getActionCommand());

                textArea.setText(content);

                // !! getContentPane().add(textArea, BorderLayout.CENTER);
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "This url doesnt exist", "Error", JOptionPane.ERROR_MESSAGE);
            }

        }
    }

    private class ButtonHandler implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent event) {
            try {
                content = URLReaderFinal.Reading(urlString.getText());
                textArea.setText(content);

                // getContentPane().add(textArea, BorderLayout.CENTER);
            } catch (Exception e) {
                System.out.println("Unable to load page");
                JOptionPane.showMessageDialog(null, "Unable to load page", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
}

edit: don't use a MouseListener on a JTextField. Perhaps you want to use a FocusListener instead.

Instead do something like:

public class LabelFrame extends JFrame {
    private static final int ROWS = 30;
    private static final int COLS = 80;
    private static final String HTTPS_SEARCH = "https:Search";

    // .....

    public LabelFrame() {
        // ....

        urlString = new JTextField(HTTPS_SEARCH, 30);

        //.....

        urlString.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                JTextField textField = (JTextField) e.getComponent();
                String text = textField.getText();
                if (text.equals(HTTPS_SEARCH)) {
                    textField.setText("");
                }
            }
        });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM