簡體   English   中英

如何限制組件位於特定位置

[英]How do you limit a component to be in a certain spot

我正在使用swing創建幻燈片並將其放置在JFrame的中心。 幻燈片效果很好,但是占據了整個中心部分。 我如何將其限制在橫幅下的一個小地方?

這是它的外觀圖片。

這是它的外觀圖片。

這是我希望它看起來像的圖片

這是我希望它看起來像的圖片

到目前為止,這是我運行的課程。

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

}
}

所以我的問題是,如何限制幻燈片放映在橫幅正下方的框中。

看看這張照片(來自Border layout Tutorial

在此處輸入圖片說明

由於您僅將面板添加到布局管理器的Center和South(PAGE_END)區域,因此沒有其他組件可以阻止Center面板盡可能伸展。

注意本教程的相關句子

如果將窗口放大, 則中心區域將獲得盡可能多的可用空間。 其他區域僅根據需要擴展以填充所有可用空間。 通常,容器僅使用BorderLayout對象的一個​​或兩個區域-只是中心,或者中心和底部。

您要么需要在另一側添加空白面板,要么在“中心”面板中使用空白邊框。 請參閱此處有關如何使用邊框的信息

我畫了背景,然后在背景上畫了圖像

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM