User Tools

Site Tools


swing:jscrollpane

Scroll Panes (Scroll Bars)

Όταν ορίζετε ένα text area ορίζετε ένα ελάχιστο εύρος γραμμών και στηλών στις οποίες εκτείνεται το συγκεκριμένο text area, π.χ.

JTextArea textArea = new JTextArea(NUMBER_OF_ROWS, NUMBER_OF_CHAR);

Ο χρήστης μπορεί να εισάγει κείμενο που εκτείνεται έξω από τα παραπάνω όρια. Εάν δεν έχετε ορίσει την ιδιότητα της αναδίπλωσης γραμμών στο text area, το κείμενο που βρίσκεται εκτός των παραπάνω ορίων μπορεί να φανεί μόνο αν ορίσετε scroll bars, ώστε να μπορείτε να πλοηγήστε οριζόντια και κατακόρυφα έξω από τα παραπάνω όρια.

Scroll bars ορίζονται από το component javax.swing.JScrollPane. Μπορείτε να φανταστείτε τα scroll bars σαν ένα κινούμενο παράθυρο πάνω από το συνολικό κείμενο που περιέχεται στο text area ή σε οποιοδήποτε άλλο component. Κάθε φορά που μετακινείτε ένα scroll bar μετακινείτε το παράθυρο ορατότητας πάνω από το component. Στην πραγματικότητα ένα text area με scroll bars είναι ένα παράθυρο ορατότητας (JScrollPane) πάνω από το text area, όπως φαίνεται στο παρακάτω σχήμα, όπου το παράθυρο ορατότητας αναφέρεται ως View port.

Για να ορίσετε ένα text area μέσα σε ένα JScrollPane απαιτείται μία δήλωση της μορφής

JScrollPane scolledTextArea = new JScrollPane(textArea);

Σε κάθε JScrollPane object ορίζεται την συμπεριφορά του οριζόντιου ScrollBar από την παρακάτω μέθοδο οι οποία λαμβάνει ως ορίσματα τις τιμές που ακολουθούν.

public void setHorizontalScrollBarPolicy(int policy) 
 
// επιτρεπόμενες τιμές
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED

Αντίστοιχα για το κάθετο ScrollBar

public void setVerticalScrollBarPolicy(int policy) 
 
// επιτρεπόμενες τιμές
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS
JScrollPane.VERTICAL_SCROLLBAR_NEVER
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED

Παράδειγμα 1ο

Ένα παράδειγμα χρήστης των παραπάνω components δίνεται παρακάτω:

TextComponentsDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class TextComponentsDemo {
 
  JFrame frame;
  JTextField textField;
  JPasswordField passwdField;
  JLabel msgLabel;
  JTextArea textArea;
  JCheckBox textFieldCheck, passwdFieldCheck;
 
  public TextComponentsDemo() {
    frame = new JFrame("Text Components Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel framePanel = new JPanel();
    framePanel.setLayout(new BoxLayout(framePanel, BoxLayout.Y_AXIS));
    frame.setContentPane(framePanel);
    JPanel textFieldPanel = new JPanel(new GridLayout(3,3));
    framePanel.add(textFieldPanel);
    textField = new JTextField(15);
    textField.addActionListener( new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        textArea.setText(textArea.getText()+(textArea.getText().isEmpty()?"":"\n")+textField.getText());
        textField.setText("");
      }
    });
    textFieldPanel.add(new JLabel("JTextField:"));
    textFieldPanel.add(textField);
    textFieldCheck = new JCheckBox("Editable", true);
    textFieldCheck.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent e) {
        if(e.getStateChange() == ItemEvent.SELECTED)
          textField.setEditable(true);
        else
          textField.setEditable(false);
      }
    });
    textFieldPanel.add(textFieldCheck);
 
    textFieldPanel.add(new JLabel("JPasswordField:"));
    passwdField = new JPasswordField();
    textFieldPanel.add(passwdField);
    passwdFieldCheck = new JCheckBox("Editable", true);
    passwdFieldCheck.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent e) {
        if(e.getStateChange() == ItemEvent.SELECTED)
          passwdField.setEditable(true);
        else
          passwdField.setEditable(false);
      }
    });
    textFieldPanel.add(passwdFieldCheck);
 
    msgLabel = new JLabel("TextArea Options:", JLabel.LEFT);    
    textFieldPanel.add(msgLabel);
 
    String []font = {"Arial", "Courier", "Verdana", "Tahoma"};
    JComboBox<String> fontCombo = new JComboBox<>(font);
    fontCombo.addActionListener( new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String option = font[fontCombo.getSelectedIndex()];
        textArea.setFont(new Font(option, Font.ITALIC|Font.BOLD, 15));
      }
    });
 
 
    String []fontColor = { "RED", "BLUE", "CYAN", "DARK_GRAY" };
    JComboBox<String> fontColorCombo = new JComboBox<>(fontColor);
    fontColorCombo.addActionListener( new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        Color c;
        switch(fontColorCombo.getSelectedIndex()) {
          case 0:
            c = Color.RED;
            break;
          case 1:
            c = Color.BLUE;
            break;
          case 2:
            c = Color.CYAN;
            break;
          case 3:
            c = Color.DARK_GRAY;
            break;          
          default:
            c = Color.YELLOW;
        }
        textArea.setForeground(c);
      }
    });
    textFieldPanel.add(fontCombo);
    textFieldPanel.add(fontColorCombo);
 
    textArea = new JTextArea(10, 20);
    textArea.setText("");
    textArea.setFont(new Font("Arial", Font.ITALIC|Font.BOLD, 15));
    textArea.setForeground(new Color(250, 30, 30));
    JScrollPane textAreaScrollPane = new JScrollPane(textArea);
    textAreaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    textAreaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    framePanel.add(textAreaScrollPane);
 
    frame.pack();
    frame.setVisible(true);
  }
 
  public static void main(String []args) {
    javax.swing.SwingUtilities.invokeLater( new Runnable() {
      public void run() {
        new TextComponentsDemo();
      }
    });
  }
}

Παρατηρήστε ότι μπορείτε να χρησιμοποιήσετε έναν ActionListener πάνω σε ένα JTextField. Το ActionEvent που παράγεται συμβαίνει όταν ο χρήστης πατήσει το πλήκτρο Enter από το πληκτρολόγιο (δεν συνδέεται με τη λειτουργία του ποντικιού).

Παράδειγμα 2ο

Το 2ο παράδειγμα είναι από το βιβλίο του Savitch.

ScrollBarDemo.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class ScrollBarDemo extends JFrame implements ActionListener {
  public static final int WIDTH = 600;
  public static final int HEIGHT = 400;
  public static final int LINES = 15;
  public static final int CHAR_PER_LINE = 30;
  private JTextArea memoDisplay;
  private String memo1;
  private String memo2;
 
  public static void main(String[] args)  {
    ScrollBarDemo gui = new ScrollBarDemo();
    gui.setVisible(true);
  }
 
  public ScrollBarDemo() {
    super("Scroll Bars Demo");
    setSize(WIDTH, HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel buttonPanel = new JPanel();
    buttonPanel.setBackground(Color.LIGHT_GRAY);
    buttonPanel.setLayout(new FlowLayout());
    JButton memo1Button = new JButton("Save Memo 1");
    memo1Button.addActionListener(this);
    buttonPanel.add(memo1Button);
    JButton memo2Button = new JButton("Save Memo 2");
    memo2Button.addActionListener(this);
    buttonPanel.add(memo2Button);
    JButton clearButton = new JButton("Clear");
    clearButton.addActionListener(this);
    buttonPanel.add(clearButton);
    JButton get1Button = new JButton("Get Memo 1");
    get1Button.addActionListener(this);
    buttonPanel.add(get1Button);
    JButton get2Button = new JButton("Get Memo 2");
    get2Button.addActionListener(this);
    buttonPanel.add(get2Button);
    add(buttonPanel, BorderLayout.SOUTH);
    JPanel textPanel = new JPanel();
    textPanel.setBackground(Color.BLUE);
 
    memoDisplay = new JTextArea(LINES, CHAR_PER_LINE);
    memoDisplay.setBackground(Color.WHITE);
    JScrollPane scrolledText = new JScrollPane(memoDisplay);
    scrolledText.setHorizontalScrollBarPolicy(
    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrolledText.setVerticalScrollBarPolicy(
    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    textPanel.add(scrolledText);
    add(textPanel, BorderLayout.CENTER);
  }
 
  public void actionPerformed(ActionEvent e) {
    String actionCommand = e.getActionCommand();
    if (actionCommand.equals("Save Memo 1"))
      memo1 = memoDisplay.getText();
    else if (actionCommand.equals("Save Memo 2"))
      memo2 = memoDisplay.getText();
    else if (actionCommand.equals("Clear"))
      memoDisplay.setText("");
    else if (actionCommand.equals("Get Memo 1"))
      memoDisplay.setText(memo1);
    else if (actionCommand.equals("Get Memo 2"))
      memoDisplay.setText(memo2);
    else
      memoDisplay.setText("Error in memo interface");
  }
 
}
swing/jscrollpane.txt · Last modified: 2018/04/13 07:34 (external edit)