2013-12-04 2 views
2

Добро пожаловать, программисты java-swing. Я хочу представить вам мою недавнюю проблему, поскольку я преследую свой хвост снова и снова. Я создал простой JFrame с контейнером JPanel (я тоже попробовал JList). Здесь я иду с BoxLayout и связкой JButtons, которые выровнены по вертикали, так же, как я хочу.

И вот возникает проблема: кадр требует прокрутки, но только вертикальный. Я хочу видеть полные обертываемые имена кнопок без горизонтальной прокрутки, только вертикальной. Текст внутри них все равно должен быть обернут, а вертикальная прокрутка должна увеличиваться, поскольку рама становится тоньше. Простое добавление контейнера в JScrollPane позволяет кнопкам освобождать их способность обертывания заголовка, и появляется нежелательная горизонтальная прокрутка. Стоит отметить, что текст кнопок будет динамичным, и он будет меняться в соответствии с различными действиями, поэтому BoxLayout в моем скромном мнении просто лучший выбор здесь.
То, что я хочу достичь, похоже на эффект JTextArea, но вместо текста моя JScrollPane будет прокручивать вниз/вверх кнопки.Вертикальная прокрутка на контейнере с конкретными JButtons в java Swing

Я не нашел простого решения этого, все надежда исчезла! Я рассчитываю на ваши навыки.
Спасибо заранее. Здесь вы идете с некоторыми кода, как мое описание не может быть достаточно ясно:

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

public class Main extends JFrame { 

    public Main() { 

     setLayout(new GridLayout(0, 1, 10, 10)); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

     final JButton tester0 = new JButton("<html>primodial one, the mighty tester of wrapping"); 
     panel.add(tester0); 

     panel.add(new JButton("one")); 
     panel.add(new JButton("<html> second one, great knight of the Order of the Didgeridoo")); 
     panel.add(new JButton("three")); 
     panel.add(new JButton("four")); 
     panel.add(new JButton("five")); 
     panel.add(new JButton("six")); 
     panel.add(new JButton("seven")); 
     panel.add(new JButton("eight")); 
     panel.add(new JButton("nine")); 
     panel.add(new JButton("ten")); 
     panel.add(new JButton("eleven")); 
     panel.add(new JButton("twelve")); 

     add(panel); 

//  JScrollPane scroll2 = new JScrollPane(panel); 
//  add(scroll2);   
//  final JScrollBar scrollBar1 = scroll2.getVerticalScrollBar(); 
////  scrollBar1. 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       Main frame = new Main(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       //frame.pack(); 
       frame.setSize(270, 200); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

С наилучшими пожеланиями!

+0

Взгляните на интерфейс [Прокручиваемый] (http://docs.oracle.com/javase/7/docs/api/javax/swing/Scrollable.html) и [этот пример] (http: // stackoverflow .com/вопросы/13466540/gridbaglayout-in-scrollpane-java-swing/13466875 # 13466875) – MadProgrammer

+0

Спасибо! Это дало мне эффект быстро и без беспорядков, именно то, что я ожидал. Я ценю ваш ответ много, сегодня я узнал очень полезную вещь. – OracleXP

+0

После оценки OracleXP я слепо положил +1 на ответ @MadProgrammer, чтобы отразить его благодарность: P – Sage

ответ

2

Похоже, что вам может понадобиться Wrap Layout, который, если требуется, будет обертывать строки в следующую строку.

0

Для записи большого совета, данного @MadProgrammer настоящим, я публикую результаты, чтобы любой мог быстро сравнить это с их собственными ожиданиями.

Wanted result


С помощью аналогичного отдельного класса я создал (и назвал его «Wrap») я изменил только немного один из строк последнего конструктора:

JScrollPane scroll2 = new JScrollPane(new Wrap(panel)); 
add(scroll2);   


и завершения добавления HTML тег для каждого имени каждой кнопки. Работает как сон.

Смежные вопросы