gpt4 book ai didi

java - 设置颜色后调整 JPanel 的大小

转载 作者:行者123 更新时间:2023-12-01 13:32:15 25 4
gpt4 key购买 nike

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

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

绘制方法中的 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`
}
}
}
}

最佳答案

编辑:

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

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

此外,将 Graphics 对象 g 转换为 Graphics2D类(class)。然后就可以使用里面的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。它使用起来非常简单,并且可能会满足您的目的。

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

祝你好运。

关于java - 设置颜色后调整 JPanel 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21501988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com