2016-07-03 4 views
0

Es gibt eine einfache Anwendung, die JScrollPane für 2 Listen verwendet und 1 Schaltfläche zum Umschalten hat. Ich möchte viele weitere Swing-Elemente hinzufügen, aber ich kann sie nicht mit object.setBounds verschieben. Was auch immer ich in diesem Methodenelement schreibe, ändert seinen Platz und seine Größe nicht.JScrollPane verwendet, so dass ich keine Grenzen anderer JComponents setzen kann

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

vorsichtig sein ' also kann ich keine Grenzen anderer JElements setzen - genau. Sie sollten nicht versuchen, setBounds() zu verwenden. Swing wurde für die Verwendung mit Layout-Managern entwickelt. Wenn Sie einen Layout-Manager verwenden, funktioniert das Bildlauffenster automatisch. – camickr

+3

Java GUIs müssen auf verschiedenen Betriebssystemen, Bildschirmgrößen, Bildschirmauflösungen usw. mit verschiedenen PLAFs in verschiedenen Locales arbeiten. Als solche sind sie nicht für ein perfektes Pixel-Layout geeignet. Verwenden Sie stattdessen Layout-Manager oder [Kombinationen davon] (http://stackoverflow.com/a/5630271/418556) zusammen mit Layout-Auffüllung und Rahmen für [Leerraum] (http://stackoverflow.com/a/17874718/ 418556). –

Antwort

4

Sie müssen Kombinationen von Layout Managers verwenden (wie von @AndrewThompson auf seinem Kommentar oben) die gleiche Leistung zu erreichen, die Sie mit einem null layout haben.

Vermeiden Sie die Verwendung von null layout finden Sie unter: Null layout is evil und Why is it frowned upon to use a null layout in Swing?

Mit dem folgenden Code Sie die gleiche Leistung haben, können Sie mit setBounds() Methode hatte. Ich habe diesem Code keinen ActionListener hinzugefügt, da ich gerade demonstriere, wie man null layout stoppt und die gleiche Ausgabe hat. Ja! Die zweite scheint kürzer, das ist wegen pack(), aber Sie können immer noch setSize(), wenn Sie eine bestimmte Fenstergröße benötigen/benötigen.

Um weitere Elemente unten nur mehr JPanel s hinzufügen und fügen Sie sie zu pane hinzufügen, ich hoffe, das hilft Ihr Problem zu lösen, und wenn nicht, schreiben Sie bitte eine Minimal Complete and Verifiable Example, die wir copy-paste können, machen es kurz, aber immer noch zeigt Ihr Problem und folgt über Empfehlungen

Wichtiger Hinweis:

ich werde ein Zitat von This answer's comment von @MadProgrammer bringen, weil ich prototypeCellValue verwendet, um die rightList ‚s Breite kürzer zu machen:

Ich würde auch mit prototypeCellValue, es sei denn, der Wert entspricht dem erwarteten Länge Ihrer Daten vorsichtig sein, es könnte Ihre Daten kürzen, wenn es angezeigt wird, muss nur

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); 
    } 
} 
Verwandte Themen