2010-12-12 5 views
4

Я просто пытаюсь добавить вертикальную полосу прокрутки в свой TextField и TextArea. Я использую ScrollPane, и по умолчанию он должен создавать вертикальную/горизонтальную полосу прокрутки.JScrollBar Проблема с вертикальной/горизонтальной установкой - Java Swing

Проблема: Мне нужна вертикальная полоса прокрутки, чтобы увидеть данные, которые не видны. В начале появляется вертикальная полоса прокрутки, но когда данные увеличиваются, вертикальная полоса прокрутки изменяется на горизонтальную полосу прокрутки. Также TextField исчезает, и вместо него появляется только горизонтальная полоса прокрутки. Я предполагаю, что это потому, что я установил границы, но я попытался изменить границы, и это заканчивается тем, что полностью уничтожает TextField.

Мой фрагмент кода:

public JTextField inputField = new JTextField(); 

public JTextArea talkArea = new JTextArea(); 

public JScrollPane inputFieldScroll = new JScrollPane(inputField); 

public JScrollPane talkAreaScroll = new JScrollPane(talkArea); 
     talkArea.setEditable(false); 

    talkArea.setBackground(Color.white); 

    talkAreaScroll.setBounds(new Rectangle(TALK_LEFT, TALK_TOP, TALK_WIDTH, TALK_HEIGHT));  

    this.getContentPane().add(talkAreaScroll, null); 

    //set input area 

     inputField.setBackground(Color.white); 

    inputField.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT)); 

    inputFieldScroll.setVerticalScrollBar(new JScrollBar()); 

    inputFieldScroll.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT)); 

Вопрос:

Есть ли какой-то параметр мне нужно установить так, что он остается вертикальная полоса прокрутки? Почему полоса прокрутки ввода занимает все поле ввода, когда данные становятся огромной линией? Он отображается как правильная вертикальная полоса прокрутки в начале.

Любые советы, оцененные.

Thanks

+0

Scrollbar на JTextField? – khachik

+0

Можете ли вы создать и опубликовать небольшой компилируемый и исполняемый пример? Кроме того, что произойдет, если вы установите предпочтительный размер JViewport JScrollPane, а не сам JScrollPane? –

ответ

3

Ниже приведен небольшой фрагмент кода, о котором я упоминал выше. Я согласен с camickr, что вы не должны использовать абсолютное позиционирование, а скорее используете менеджеров макетов. Если вам абсолютно необходимо иметь горизонтальную полосу прокрутки для JTextField, то один из способов заставить ее работать - это всегда показывать ее, используя конструктор JScrollPane, который позволяет это. то есть,

 JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

Для получения, например,

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

public class FuSwing1b extends JPanel { 
    private static final int TA_ROWS = 25; 
    private static final int TA_COLS = 60; 
    private JTextField inputField = new JTextField(); 
    private JTextArea talkArea = new JTextArea(TA_ROWS, TA_COLS); 

    public FuSwing1b() { 
     talkArea.setEditable(false); 
     talkArea.setFocusable(false); 
     talkArea.setBackground(Color.white); 
     //talkArea.setPreferredSize(new Dimension(TALK_WIDTH, TALK_HEIGHT)); 

     JScrollPane talkPane = new JScrollPane(talkArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
        JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

     int gap = 10; 
     setLayout(new BorderLayout(gap, gap)); 
     add(talkPane, BorderLayout.CENTER); 
     add(inputPane, BorderLayout.SOUTH); 
     setBorder(BorderFactory.createEmptyBorder(gap , gap, gap, gap)); 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("FuSwing1b"); 
     frame.getContentPane().add(new FuSwing1b()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+2

Вы никогда не должны устанавливать предпочтительный размер текстовой области, если вы хотите, чтобы полоса прокрутки работала правильно. Полосы прокрутки появляются, когда предпочтительный размер текстовой области больше, чем размер прокрутки. Если вы жестко задаете предпочтительный размер текстовая область, тогда добавление текста не влияет на его предпочтительный размер. – camickr

+0

Спасибо за предложение и исправление! Вы, конечно, правильно. Я отредактирую сообщение выше, чтобы это отразить. –

+0

Привет .. Я пробовал это: (inputField, JScrollPane. VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); установка для моей панели прокрутки .. но не было никакой разницы. Закончилось получение горизонтальной панели, когда данные превысили размер моего текстового поля. :( – JJunior

1

Не играйте с границами. Используйте диспетчер компоновки, и вам не придется беспокоиться об этом.

При создании использовать что-то вроде текстового поля:

JTextField textField = new JTextField(10); 

Это создаст текстовое поле, которое будет содержать минимум 10 символов. Если количество символов превышает ширину отображения текстового поля, использование может видеть оставшиеся символы с помощью клавиш со стрелками вправо/влево. Это обычный пользовательский интерфейс, используемый всеми приложениями, которые я когда-либо видел. Не пытайтесь создать свой собственный пользовательский интерфейс, используя горизонтальную полосу прокрутки. Пользователи не привыкли к этому.

для текстовой области вы можете создать его с помощью:

JTextArea textArea = new JTextArea(5, 30); 
JScrollPane scrollPane = new JScrollPane(textArea); 

создать текстовую область с 5 строк и примерно 30 символов в строке.

Теперь добавьте текстовое поле и прокрутку в рамку «с помощью менеджеров компоновки», а затем установите фрейм. Менеджеры макетов будут определять лучший размер для компоновщиков. Полосы прокрутки автоматически появятся в текстовой области, когда вы добавите в нее текст, а текст превышает 5 строк.

+0

По какой-то причине я не могу проголосовать за ваш ответ. :( –