【问题标题】:Resize JPanel after setting color设置颜色后调整JPanel大小
【发布时间】:2014-02-01 18:41:23
【问题描述】:

长话短说,我的JFrame 中有两个JPanel 对象,一个是调整面板,另一个是图形面板。当我调整窗口大小时,图形面板不会相应地调整大小。

我有两个类,一个是GUImodel类,一个是ModelSim(模型模拟)类,其中GUImodel类可视化ModelSim中的模拟部分。

draw 方法中的 i,j 索引覆盖了我的图形 JPanel 中的 (770,460) 个像素。 fillRect 根据我在上面代码中的定义为每个像素着色 770x460 像素。如何通过展开窗口来调整图形JPanel 的大小。从逻辑上讲,通过调整图形面板的大小,彩色像素将不再具有方形,这在我的情况下很好。

请帮帮我,我该怎么做? 如果您需要任何其他信息,请告诉我


这是可运行的代码;第一个类是 GUICA,另一个是 ModelSim。

吉卡:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.*;

/**
 * Cellular Automata Graphical User Interface
 * @author Mahdi
 * @version 1.0
 */
// This code provide a simple GUI for Cellular Automata 
// Notice that we are going to extend our super class JFrame which is the main window of our simulation
// Inside this JFrame, we are going to add two subframes, which are called JPanels.
public class GUICA extends JFrame {

    // We need to make to Jpanels inside the main Jframe

    // First Jpanel is adjustPanel
    private JPanel adjustPanel;
    // Second Jpanel is graphicPanel
    private JPanel graphicPanel;

    // Now it is the time to create buttons
    private JButton startButton;
    private JButton resetButton;
    private JButton stopButton;

    // We need to make an object from our model to implement that one in GUI part
     private ModelSim model;

    // We need also timer to re-implement (update) our simulation
     private Timer timer;

    // Detrmining the initial values of Windows panel main size
     static int widthPixel = 766;
     static int heightPixel = 468;
     Rectangle bounds;
    // Now, that's the time to create our constructor
    public GUICA(){
        // Here super is our JFrame and the string defines the name of our Frame.
        super("Cellular Automata Evacuation");
        // The below code will close the window(JFrame), once we have click on window exit
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //lets define the default size of our window page(main JFrame), where the first value is the x and second one is y;
        setSize(widthPixel,heightPixel);


        // First let's define the role of our timer in our future simulation. We first have to initialize our object in
        // the constructor, then with an actionlistener, we will define the role of timerlistener with a nested class.
        timer = new Timer(1,new TimerListener());

        // We need to initialize our buttons right now.
        // The important factor here is the actionlistener, we need to addactionlistener to each button to define their duties.
        // Their duties can be defined by a nested class (which is defined inside our main class)
        startButton = new JButton("Start");
        startButton.addActionListener(new StartListener());

        resetButton = new JButton("Reset");
        resetButton.addActionListener(new ResetListener());

        stopButton = new JButton("Stop");
        stopButton.addActionListener(new StopListener());

        // There are many options to put the buttons in different part of the JPanel, I am going to use not the easiest one
        // but the handiest one. We want to accommodate our buttons inside adjustPanel
        adjustPanel = new JPanel(new GridBagLayout());
        // The below code is for determining the position of our buttons
        GridBagConstraints grid = new GridBagConstraints();

        grid.insets = new Insets(10,10,10,10);
        // For start button
        grid.gridx = 0;
        grid.gridy = 1;
        adjustPanel.add(startButton, grid);
        // For stop button
        grid.gridx = 0;
        grid.gridy = 2;
        adjustPanel.add(resetButton,grid);
        //Let's Separate the buttons from each other with the below tricky method
        grid.insets = new Insets(20,20,20,20);
        JLabel white = new JLabel();
        grid.gridx = 0;
        grid.gridy = 3;
        adjustPanel.add(white,grid);
        // For stop button
        grid.gridx = 0;
        grid.gridy = 4;
        adjustPanel.add(stopButton,grid);

        // We can determine that how much of the space is going to be belonged to adjustPanel
        adjustPanel.setPreferredSize(new Dimension(100,heightPixel));
        // We need to add this panel to our main JFrame panel; also we can determine where we want to place this panel
        // I won't use grid method to place this panel. However,instead, I use the simplest way to determine the position of panels
        setLayout(new BorderLayout());
        add(adjustPanel,BorderLayout.WEST);

        // What about the other panel (graphicPanel) we need to initialize again, but we do not need to determine the exact position
        // of this panle, because it will cover the whole remainder JFrame as its own property
        graphicPanel = new JPanel();
        graphicPanel = new GraphicPanel();
        graphicPanel.setPreferredSize(new Dimension(widthPixel-100,heightPixel));
        //graphicPanel.setBackground(Color.white);
        add(graphicPanel,BorderLayout.CENTER);
        bounds = new Rectangle(widthPixel-100,heightPixel);
        model = new ModelSim(bounds);
    }
    // Start button action listener
    private class StartListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {
            timer.start();

        }
    }

    // Reset button action listener
    private class ResetListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {
             model = new ModelSim(bounds);

        }
    }

    // Stop button action listener
    private class StopListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {
            timer.stop();

        }
    }
    // Stop button action listener
    private class TimerListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {

            model.update();

        }
    }

    private class GraphicPanel extends JPanel{
        public GraphicPanel(){
            setPreferredSize(new Dimension(widthPixel-100,heightPixel));
            //super.revalidate();
            //super.repaint();
            //System.out.println(widthPixel);
        }
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, widthPixel-100,heightPixel);
            model.draw(g);

        }

    }

    // To make the code runnable, we need provide static main class
    public static void main(String[] args){
        JFrame gui = new GUICA();
        gui.pack();
        gui.setVisible(true);


    }
}

ModelSim 代码:​​

import java.awt.*;
import java.util.ArrayList;

public class ModelSim {
    private Rectangle bounds;
    private Color color;

    public ModelSim(Rectangle bounds){
        // Properties
        this.bounds = bounds;
    }

    public void update(){

    }
        // Defining the static values together with walls and prohibited places.
    public void draw(Graphics g){
        // Pixel Grow
        int pgw = 1;
        int pgh = 1;
        for(int j = 0; j < bounds.getHeight(); j++){
            for(int i = 0; i < bounds.getWidth(); i++){
                if (i<100){
                    g.setColor(color.RED);
                    g.fillRect(i,j,pgw,pgh);

                }else if(i>100){
                    g.setColor(color.GREEN);
                    g.fillRect(i,j,pgw,pgh);
                }`enter code here`
          }
        }
    }
}

【问题讨论】:

标签: java swing resize jpanel paintcomponent


【解决方案1】:

编辑:

我想您的面板正在调整大小,但您看不到它,因为您有硬编码的背景颜色。为避免这种情况,我建议您使用类似

g.fillRect(0, 0, this.getWidth(), this.getHeight());

另外,将 Graphics 对象 g 转换为 Graphics2D 类。然后你可以在其中使用 scale 方法。 x 轴和 y 轴的缩放因子是双倍的并且是分开的。

在你的情况下,比例因子应该是

double scaleX = this.getWidth() / 770.0;
double scaleY = this.getHeight() / 460.0;

// Now simply call scale
((Graphics2D) g).scale(scaleX, scaleY);

把它放在画任何东西之前。

希望这会有所帮助。


您需要使用适当的布局管理器将面板放置在 JFrame 中。

如果您只有两个面板,我建议您使用 BorderLayout。它使用起来非常简单,可能会达到您的目的。

这样,当您调整窗口大小时,您的面板会调整大小。

祝你好运。

【讨论】:

  • 其实我用的是BorderLayout,但是它并没有调整我的图形面板的大小;我认为原因是我已经定义了一个特定的像素应该有某种颜色。
  • @user3208567 如果没有可运行的示例来演示您的问题,那么我们无能为力...
  • 你是对的,我正在做硬编码着色,但根据你的代码,我无法访问我的某个像素来着色它。
  • 我添加了 RUNNABLE 代码,请尝试那个并告诉我问题出在哪里。
猜你喜欢
  • 2015-11-24
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
相关资源
最近更新 更多