简体   繁体   中英

How do you limit a component to be in a certain spot

I'm creating a slideshow using swing and trying to place it in the center of my JFrame. The slideshow works fine, but it's taking up the entire center section. How would I limit it to a small place under the banner?

Here's a picture of what it looks like.

这是它的外观图片。

Here's a picture of what I want it to look like

这是我希望它看起来像的图片

This is what I have so far, you run this class.

package com.RBV2.engine;

import javax.swing.*;

import com.RBV2.Settings;
import com.RBV2.panels.News;
import com.RBV2.panels.SlideShow;
import com.RBV2.panels.SlideShow.MovingPanel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;

import java.io.*;
/*
 * Author Jon & David
 * 
 */
@SuppressWarnings("serial")
public class Client extends JFrame implements ActionListener {
    private JPanel bottomPanel, news;
    private JButton launch;
    private JLabel loading, banner;
    private MovingPanel slideshow;

    protected boolean updated = false;

    private void createLayout() {
        createPanel();
        addPanel();
        setVisible(true);
    }   

     private void createPanel() {
         bottomPanel = new JPanel(new BorderLayout());
         news = new News();
         slideshow = new SlideShow.MovingPanel();
         launch = new JButton(new URL("http://www.runerebellion.com/clientImages/launch.png"));
         loading = new JLabel(new URL("http://www.runerebellion.com/clientImages/loader.gif"));
         banner = new JLabel(new URL("http://www.runerebellion.com/clientImages/201457.gif"));
         launch.addActionListener(this);
     }

     private void addPanel() {
         setTitle("RuneRebellionV2 Launcher");
         setDefaultCloseOperation(EXIT_ON_CLOSE);
         setResizable(false);
         //Bottom Panel
         add(bottomPanel, BorderLayout.SOUTH);
         bottomPanel.add(new JLabel(" Launcher, release " + Settings.version), BorderLayout.WEST);
         bottomPanel.setBackground(Color.BLACK);
         bottomPanel.add(launch, BorderLayout.EAST);
         launch.setPreferredSize(new Dimension(120, 40));
         //News Feed
         add(news, BorderLayout.CENTER);
         news.add(banner, BorderLayout.CENTER);
         banner.setPreferredSize(new Dimension(500, 70));
         //slideshow
         slideshow.setPreferredSize(new Dimension(610, 331));
         add(slideshow, BorderLayout.CENTER);
         //Sets size
         setSize(Settings.width, Settings.height);
     }

     public Client() throws IOException {
        createLayout();
    }

    public static void main(String args[]) throws IOException {
        final Client l = new Client();
        l.setVisible(true);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                l.setVisible(true);
            }
        });

    }

These specific lines of code call the slideshow(I commented out exactly where)

 private void addPanel() {
 setTitle("RuneRebellionV2 Launcher");
 setDefaultCloseOperation(EXIT_ON_CLOSE);
 setResizable(false);
     //Bottom Panel
     add(bottomPanel, BorderLayout.SOUTH);
     bottomPanel.add(new JLabel(" Launcher, release " + Settings.version), BorderLayout.WEST);
     bottomPanel.setBackground(Color.BLACK);
     bottomPanel.add(launch, BorderLayout.EAST);
     launch.setPreferredSize(new Dimension(120, 40));
     //News Feed
     add(news, BorderLayout.CENTER);
     news.add(banner, BorderLayout.CENTER);
     banner.setPreferredSize(new Dimension(500, 70));
     //slideshow here
     slideshow.setPreferredSize(new Dimension(610, 331));
     add(slideshow, BorderLayout.CENTER);
     //Sets size
     setSize(Settings.width, Settings.height);
 }

Here is my slideshow class, you may need this also.

package com.RBV2.panels;

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

@SuppressWarnings("serial")
public class SlideShow extends JFrame {
    public static class MovingPanel extends JPanel {
        public int i = 0;

    public MovingPanel() {
        Timer timer = new Timer(3000, new TimerListener());
        timer.start();
    }

    protected void paintComponent(Graphics x) {
        super.paintComponent(x);
        int y = i % 25;

        Image showImg = new ImageIcon("bin/slide/" + y + ".png").getImage();
        x.drawImage(showImg, 0, 0, getWidth(), getHeight(), 0, 0, 610, 331, null);
    }

    class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            i++;
            repaint();
            if (i >= 5)
                i = 1;
        }
    }

}
}

So my question is how would I limit the slideshow to be in a box in the very center under the banner.

Have a look at this picture (from Border layout Tutorial )

在此处输入图片说明

As you are only adding panels to the Center and South(PAGE_END) regions of the layout manager there is no other components to stop the center panel from stretching out as far as it can.

Note this relevant sentence of the tutorial

If the window is enlarged, the center area gets as much of the available space as possible. The other areas expand only as much as necessary to fill all available space. Often a container uses only one or two of the areas of the BorderLayout object — just the center, or the center and the bottom.

You either need to add blank panels on the other sides or make use of an empty border within your Center panel. See here about how to use borders .

I painted the background, then painted the images over the background

protected void paintComponent(Graphics x) {
            super.paintComponent(x);
            int y = i % 25;

            Image showImg = new ImageIcon("bin/slide/" + y + ".png").getImage();
            super.paintComponent(x);
            x.drawImage((Settings.background).getImage(), 0, 0, getWidth(), getHeight(), this);
            x.drawImage(showImg, 360, 260, getWidth(), getHeight(), 0, 0, 110, 31, null);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM