user6544819
user6544819

Reputation: 1

JScrollPane used so I can't set bounds of other JComponents

There's a simple application that uses JScrollPane for 2 lists and have 1 button to switch them. I want to add many more Swing elements, but I cannot move them with object.setBounds. Whatever I will write in this method element doesn't change its place and size.

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

Upvotes: 0

Views: 547

Answers (1)

Frakcool
Frakcool

Reputation: 11153

You need to use combinations of Layout Managers (as stated by @AndrewThompson on his comment above) to achieve the same output that you have with a null layout.

Avoid the use of null layout, see: Null layout is evil and Why is it frowned upon to use a null layout in Swing?

With the code below you can have the same output you had with setBounds() method. I didn't added an ActionListener to this code, since I'm just demonstrating how to stop using null layout and have the same output. Yes! The second one seems shorter, that's because of pack() but you can still setSize() if you want / need an specific window size.

To add more elements below just add more JPanels and add them to pane, I hope this helps to solve your issue, and if not, please post a Minimal Complete and Verifiable Example that we can copy-paste, make it short, but still shows your issue and follows above recommendations

Important Note:

I'll bring a quote from This answer's comment of @MadProgrammer, because I used prototypeCellValue to make the rightList's width shorter:

I'd also be careful with prototypeCellValue, unless the value matches the expected length of your data, it could truncate your data when it's displayed, just need to be careful

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

Upvotes: 4

Related Questions