如何将组件限制在某个位置

时间:2014-02-09 19:08:34

标签: java swing layout jframe

我正在使用swing创建幻灯片,并尝试将其放置在JFrame的中心。幻灯片放映工作正常,但它占据了整个中心部分。我如何将它限制在旗帜下的一个小地方?

这是一张它的样子。

Here's a picture of what it looks like.

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

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

这就是我到目前为止,你运行这个课程。

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

    }

这些特定的代码行调用幻灯片显示(我确切地说明了哪里)

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

这是我的幻灯片课程,您可能也需要这个。

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

}
}

所以我的问题是如何将幻灯片限制在横幅下方正中央的框中。

2 个答案:

答案 0 :(得分:1)

查看此图片(来自Border layout Tutorial

enter image description here

由于您只是将面板添加到布局管理器的中心和南(PAGE_END)区域,因此没有其他组件可以阻止中心面板尽可能伸展。

请注意本教程的相关句子

  

如果窗口被放大,中心区域将获得尽可能多的可用空间。其他区域仅扩展所需的空间以填充所有可用空间。通常,容器只使用BorderLayout对象的一个​​或两个区域 - 只是中心,中心和底部。

您需要在另一侧添加空白面板或在中心面板中使用空白边框。请点击此处了解how to use borders

答案 1 :(得分:0)

我画了背景,然后在背景上画了图像

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