Java 收缩框架不工作
我有一个Java 收缩框架不工作,java,swing,user-interface,resize,jframe,Java,Swing,User Interface,Resize,Jframe,我有一个JFrame和一些子JPanel对象。当我调整JFrame的大小并使其变大时,一切正常,子面板的大小正确。但是,如果收缩JFrame,面板将保持不变,并且会被裁剪。无论我使用什么布局,这种情况都会发生 我知道我可以使用EventListener手动设置大小,但我的问题是:为什么会发生这种情况?为什么它在放大时工作良好,而在缩小时却不工作?我是否可以在没有事件侦听器的情况下解决它(可能是一些配置问题) 我正在使用Netbeans 7.3,以防相关 ==编辑==== 在尝试获取一个最小的示例
JFrame
和一些子JPanel
对象。当我调整JFrame的大小并使其变大时,一切正常,子面板的大小正确。但是,如果收缩JFrame,面板将保持不变,并且会被裁剪。无论我使用什么布局,这种情况都会发生
我知道我可以使用EventListener
手动设置大小,但我的问题是:为什么会发生这种情况?为什么它在放大时工作良好,而在缩小时却不工作?我是否可以在没有事件侦听器的情况下解决它(可能是一些配置问题)
我正在使用Netbeans 7.3,以防相关
==编辑====
在尝试获取一个最小的示例时,我意识到问题是我试图添加的组件之一,这是我自己造成的。它是一个扩展java.awt.Canvas
并绘制排球场的对象
然而,我一直无法找到它为什么不能正常收缩。代码如下:
import java.awt.*;
import java.util.Arrays;
import javax.print.attribute.standard.OrientationRequested;
public class CourtCanvas extends Canvas {
private int courtHeight = 100;
private int courtWidth = 200;
private int left = 10;
private int top = 10;
private Point center = new Point();
private Color bgColor = new Color(52, 153, 204);
private Color lineColor = new Color(255, 255, 255);
private Color floorColor = new Color(255, 153, 0);
private OrientationRequested orientation;
public CourtCanvas() {
calcDimensions();
setBackground(bgColor);
for (int i = 0; i < localCoords.length; i++) {
localCoords[i] = new Point();
visitCoords[i] = new Point();
}
}
private void calcDimensions() {
if (this.getHeight() > this.getWidth()) {
orientation = OrientationRequested.PORTRAIT;
courtHeight = (int) Math.min(this.getHeight() * 0.9, this.getWidth() * 1.8);
courtWidth = (int) (courtHeight / 2.0);
}
else {
orientation = OrientationRequested.LANDSCAPE;
courtWidth = (int) Math.min(this.getWidth()* 0.9, this.getHeight() * 1.8);
courtHeight = (int) (courtWidth / 2.0);
}
center.x = (int) (getWidth() / 2.0);
center.y = (int) (getHeight() / 2.0);
left = (int) (center.x - courtWidth / 2.0);
top = (int) (center.y - courtHeight / 2.0);
}
@Override
public void paint(Graphics g) {
setBackground(bgColor);
calcDimensions();
drawFloor(g);
drawLines(g);
}
private void drawFloor(Graphics g) {
g.setColor(floorColor);
g.fillRect(left, top, courtWidth, courtHeight);
}
private void drawLines(Graphics g) {
if (orientation == OrientationRequested.PORTRAIT) {
drawLines_Portrait(g);
}
else {
drawLines_Landscape(g);
}
}
private void drawLines_Portrait(Graphics g) {
g.setColor(lineColor);
// perimeter
g.drawRect(left, top, courtWidth, courtHeight);
// center line
g.drawLine(left, center.y, left + courtWidth, center.y);
// local attack line
g.drawLine(left, center.y + courtHeight / 6, left + courtWidth, center.y + courtHeight / 6);
// visitor attack line
g.drawLine(left, center.y - courtHeight / 6, left + courtWidth, center.y - courtHeight / 6);
}
private void drawLines_Landscape(Graphics g) {
g.setColor(lineColor);
// perimeter
g.drawRect(left, top, courtWidth, courtHeight);
// center line
g.drawLine(center.x, top, center.x, top + courtHeight);
// local attack line
g.drawLine(center.x - courtWidth / 6, top, center.x - courtWidth / 6, top + courtHeight);
// visitor attack line
g.drawLine(center.x + courtWidth / 6, top, center.x + courtWidth / 6, top + courtHeight);
}
}
import java.awt.*;
导入java.util.array;
导入javax.print.attribute.standard.orientationrequired;
公共类CourtCanvas扩展画布{
私家庭院高度=100;
私家庭院宽度=200;
私人整数左=10;
私人int top=10;
专用点中心=新点();
私有颜色bgColor=新颜色(52153204);
专用颜色lineColor=新颜色(255、255、255);
专用颜色floorColor=新颜色(255,153,0);
私人定向要求定向;
公共法庭(){
计算尺寸();
挫折背景(bgColor);
for(int i=0;ithis.getWidth()){
方向=要求的方向。纵向;
courthheight=(int)Math.min(this.getHeight()*0.9,this.getWidth()*1.8);
球场宽度=(整数)(球场高度/2.0);
}
否则{
方向=要求的方向。横向;
courtWidth=(int)Math.min(this.getWidth()*0.9,this.getHeight()*1.8);
球场高度=(内部)(球场宽度/2.0);
}
center.x=(int)(getWidth()/2.0);
y=(int)(getHeight()/2.0);
左=(int)(中心x-球场宽度/2.0);
顶部=(内部)(中心y-球场高度/2.0);
}
@凌驾
公共空间涂料(图g){
挫折背景(bgColor);
计算尺寸();
绞车(g);
抽绳(g);
}
专用抽油机(图g){
g、 setColor(地板颜色);
g、 fillRect(左、上、球场宽度、球场高度);
}
专用空心抽绳(图g){
如果(方向==要求的方向.纵向){
素描(g);
}
否则{
景观用抽绳(g);
}
}
专用虚空抽绳\纵向(图形g){
g、 setColor(lineColor);
//周界
g、 drawRect(左、上、球场宽度、球场高度);
//中线
g、 抽绳(左,中心y,左+球场宽度,中心y);
//局部攻击线
g、 抽绳(左,中间.y+球场高度/6,左+球场宽度,中间.y+球场高度/6);
//访客攻击线
g、 抽绳(左,中间.y-球场高度/6,左+球场宽度,中间.y-球场高度/6);
}
私人空间抽绳\景观(图g){
g、 setColor(lineColor);
//周界
g、 drawRect(左、上、球场宽度、球场高度);
//中线
g、 抽绳(中心.x,顶部,中心.x,顶部+球场高度);
//局部攻击线
g、 抽绳(中心.x-球场宽度/6,顶部,中心.x-球场宽度/6,顶部+球场高度);
//访客攻击线
g、 抽绳(中心x+球场宽度/6,顶部,中心x+球场宽度/6,顶部+球场高度);
}
}
可能有许多原因导致所述行为。
例如,设置为面板的最小尺寸
Java布局管理器应该适合您。
教程:您可能正在混合Swing和AWT、轻量级和重量级组件。我的建议是只使用Swing/轻量级组件
此外,在Swing中,您扩展了paintComponent
而不是paint
,并调用super
方法
Here is a rework of your code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import javax.print.attribute.standard.OrientationRequested;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class CourtCanvas extends JPanel {
private int courtHeight = 100;
private int courtWidth = 200;
private int left = 10;
private int top = 10;
private Point center = new Point();
private Color bgColor = new Color(52, 153, 204);
private Color lineColor = new Color(255, 255, 255);
private Color floorColor = new Color(255, 153, 0);
private OrientationRequested orientation;
private Point[] localCoords = new Point[5];
private Point[] visitCoords = new Point[5];
public CourtCanvas() {
calcDimensions();
setBackground(bgColor);
for (int i = 0; i < localCoords.length; i++) {
localCoords[i] = new Point();
visitCoords[i] = new Point();
}
}
private void calcDimensions() {
if (this.getHeight() > this.getWidth()) {
orientation = OrientationRequested.PORTRAIT;
courtHeight = (int) Math.min(this.getHeight() * 0.9, this.getWidth() * 1.8);
courtWidth = (int) (courtHeight / 2.0);
} else {
orientation = OrientationRequested.LANDSCAPE;
courtWidth = (int) Math.min(this.getWidth() * 0.9, this.getHeight() * 1.8);
courtHeight = (int) (courtWidth / 2.0);
}
center.x = (int) (getWidth() / 2.0);
center.y = (int) (getHeight() / 2.0);
left = (int) (center.x - courtWidth / 2.0);
top = (int) (center.y - courtHeight / 2.0);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
calcDimensions();
drawFloor(g);
drawLines(g);
}
private void drawFloor(Graphics g) {
g.setColor(floorColor);
g.fillRect(left, top, courtWidth, courtHeight);
}
private void drawLines(Graphics g) {
if (orientation == OrientationRequested.PORTRAIT) {
drawLines_Portrait(g);
} else {
drawLines_Landscape(g);
}
}
private void drawLines_Portrait(Graphics g) {
g.setColor(lineColor);
// perimeter
g.drawRect(left, top, courtWidth, courtHeight);
// center line
g.drawLine(left, center.y, left + courtWidth, center.y);
// local attack line
g.drawLine(left, center.y + courtHeight / 6, left + courtWidth, center.y + courtHeight / 6);
// visitor attack line
g.drawLine(left, center.y - courtHeight / 6, left + courtWidth, center.y - courtHeight / 6);
}
private void drawLines_Landscape(Graphics g) {
g.setColor(lineColor);
// perimeter
g.drawRect(left, top, courtWidth, courtHeight);
// center line
g.drawLine(center.x, top, center.x, top + courtHeight);
// local attack line
g.drawLine(center.x - courtWidth / 6, top, center.x - courtWidth / 6, top + courtHeight);
// visitor attack line
g.drawLine(center.x + courtWidth / 6, top, center.x + courtWidth / 6, top + courtHeight);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new CourtCanvas());
frame.setSize(500, 400);
frame.setVisible(true);
}
});
}
}
下面是对代码的重做:
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Point;
导入javax.print.attribute.standard.orientationrequired;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类扩展JPanel{
私家庭院高度=100;
私家庭院宽度=200;
私人整数左=10;
私人int top=10;
专用点中心=新点();
私有颜色bgColor=新颜色(52153204);
专用颜色lineColor=新颜色(255、255、255);
专用颜色floorColor=新颜色(255,153,0);
私人定向要求定向;
专用点[]本地坐标=新点[5];
专用点[]VisitCords=新点[5];
公共法庭(){
计算尺寸();
挫折背景(bgColor);
for(int i=0;ithis.getWidth()){
方向=要求的方向。纵向;
courthheight=(int)Math.min(this.getHeight()*0.9,this.getWidth()*1.8);
球场宽度=(整数)(球场高度/2.0);
}否则{
方向=要求的方向。横向;
courtWidth=(int)Math.min(this.getWidth()*0.9,this.getHeight()*1.8);
考特