2016-07-03 9 views
0

Существует простое приложение, которое использует JScrollPane для 2 списков и имеет 1 кнопку для их переключения. Я хочу добавить еще несколько элементов Swing, но я не могу их переместить с помощью object.setBounds. Все, что я напишу в этом методе, не изменяет его место и размер.JScrollPane используется так, что я не могу установить границы других JComponents

package paka; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*;; 
public class Question extends JFrame { 
    private JList leftlist,rightlist; 
    private JButton movebutton; 
    private JLabel pointlessLabel; 
    private static String[] foods={"bacon","wings","ham","beef","more bacon"}; 

    public Question(){ 
     super("title"); 
     setLayout(new FlowLayout()); 

     leftlist=new JList(foods); 
     leftlist.setVisibleRowCount(3); 
     leftlist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
     add(new JScrollPane(leftlist)); 
     movebutton = new JButton("Move"); 

     movebutton.addActionListener(
       new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent arg0) { 
         rightlist.setListData(leftlist.getSelectedValues()); 

        } 
       } 
       ); 
     add(movebutton); 

     rightlist = new JList(); 
     rightlist.setVisibleRowCount(3); 
     rightlist.setFixedCellWidth(100);rightlist.setFixedCellHeight(15); 
     rightlist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
     add(new JScrollPane(rightlist));   

     //Okay, deleting everything below we have only two list with button that moves elements from 1st list to 2nd 

     movebutton = new JButton("Click me!"); 
     movebutton.setBounds(700, 100, 80, 20); 
     add(movebutton); 

     pointlessLabel = new JLabel("I'm unbreakable"); 
     pointlessLabel.setBounds(500,200,100,50); 
     add(pointlessLabel); 



    } 

    public static void main(String args[]){ 
     Question go = new Question(); 
     go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     go.setSize(300,200); 
     go.setVisible(true); 
    } 
} 
+5

' поэтому я не могу установить границы других JElements' точно. Вы не должны пытаться использовать setBounds(). Swing был разработан для использования с менеджерами компоновки. Если вы используете диспетчер компоновки, тогда панель прокрутки будет работать автоматически. – camickr

+3

Java GUI должны работать с различными ОС, размером экрана, разрешением экрана и т. Д., Используя разные PLAF в разных локалях. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). –

ответ

4

Вы должны использовать комбинации Layout Managers (как заявлено @AndrewThompson на своем комментарии выше), чтобы получить тот же результат, что у вас есть с null layout.

Избегайте использование null layout, см: Null layout is evil и Why is it frowned upon to use a null layout in Swing?

С кодом ниже вы можете иметь один и тот же вывод, который вы имели с setBounds() методом. Я не добавил ActionListener к этому коду, так как я просто демонстрирую, как прекратить использование null layout и иметь тот же результат. Да! Второй кажется короче, это из-за pack(), но вы все равно можете setSize(), если вы хотите/нуждаетесь в определенном размере окна.

Чтобы добавить больше элементов ниже просто добавить больше JPanel с и добавить их в pane, я надеюсь, что это помогает решить проблему, а если нет, пожалуйста, напишите Minimal Complete and Verifiable Example, что мы можем копировать-вставить, сделать его коротким, но все-таки показывает ваш вопрос и следует выше рекомендаций

Важное примечание:

Я приведу цитату из This answer's comment из @MadProgrammer, потому что я использовал prototypeCellValue, чтобы ширина rightList «s короче:

Я бы также быть осторожным с prototypeCellValue, если значение не соответствует ожидаемой длине ваших данных, это может укоротить ваши данные, когда она отображается, просто нужно быть осторожным

enter image description here

import java.awt.FlowLayout; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

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

    public static void createAndShowGUI() { 
     String[] foods = { "bacon", "wings", "ham", "beef", "more bacon" }; 

     JFrame frame; 
     JPanel topPane, bottomPane, pane; 
     JList leftList, rightList; 
     JButton moveButton, clicMeButton; 
     JScrollPane scroll; 
     JLabel label; 

     frame = new JFrame("title"); 
     topPane = new JPanel(); 
     bottomPane = new JPanel(); 
     pane = new JPanel(); 
     leftList = new JList(foods); 
     rightList = new JList(); 
     moveButton = new JButton("Move"); 
     clicMeButton = new JButton("Click me!"); 
     label = new JLabel("I'm unbreakable"); 

     leftList.setVisibleRowCount(3); 
     rightList.setVisibleRowCount(3); 
     leftList.setPrototypeCellValue(String.format("%30s", "")); 
     rightList.setPrototypeCellValue(String.format("%30s", "")); 

     pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS)); 
     topPane.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); 

     scroll = new JScrollPane(leftList); 

     topPane.add(scroll); 
     topPane.add(moveButton); 

     scroll = new JScrollPane(rightList); 
     topPane.add(scroll); 

     bottomPane.setLayout(new FlowLayout()); 
     bottomPane.add(clicMeButton); 
     bottomPane.add(label); 

     pane.add(topPane); 
     pane.add(bottomPane); 
     frame.add(pane); 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
}