【问题标题】:Graphics Panel Resizing图形面板调整大小
【发布时间】:2023-04-02 00:54:02
【问题描述】:

这是更改为 JPanel 的更新代码。它正在显示显示,但即​​使通过创建一个类并尝试从命令中移动它,我似乎也无法移动海龟。

我还需要做什么才能将其显示在中心?

另外,添加我从上一个版本中所做的所有代码是否容易

谢谢

import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.JFrame
import javax.swing.SwingUtilities;

{

        });
  }

  private static void createAndShowGUI() {
      System.out.println("Created GUI on EDT? "+          
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.add(new GraphicsPanel());
      f.pack();
      f.setVisible(true);
image.getHeight());
}

public void setballColour(Color col)
{
    Graphics g = ballDisplay.getGraphics();
    g.setColor(col);
    g.fillRect(0, 0, ballDisplay.getWidth(),  ballDisplay.getHeight()); }

    @Override
     public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, null);
            g.drawImage(ballDisplay, xPos-Object_X_SIZE/2, yPos-Object_Y_SIZE/2, null);                 

    // render the image on the panel.
    g.drawImage(image, 0, 0, null);
    g.drawImage(ballDisplay, xPos-Object_X_SIZE/2, yPos-Object_Y_SIZE/2, null); }

/**
 * Constructor.
 */
public PanelMy() {

    setBorder(BorderFactory.createLineBorder(Color.black));}

     public Dimension getPreferredSize() {
            return new Dimension(800,400);
     }
     {


    //main drawing area
    image = new Scanner(800, 400, Scanner.TYPE_INT_RGB);

【问题讨论】:

  • 你想用大型机修复jtextfield的大小吗?
  • @IsuruDilshan 是的 :) 当我在框中输入时,它占用了主机,所以我看不到乌龟在做什么。
  • 所以知道你在得到所有帮助后“不接受”所有答案。我猜你以后真的不想要任何帮助了。

标签: java


【解决方案1】:

我希望能够调整 JTextField 的大小

private JTextField console = new JTextField(15);

以上内容将导致文本字段自身的大小可容纳 15 个字母(不是像素),大小相当于给定字体的“W”大小。

例如,他们可以输入“forward”、“turnleft”、“turnright”等。

由于最大的单词只有 9 个字符,您应该使用:

private JTextField console = new JTextField(9);

作为最大值。

你可以罚款 7 或 8 更好。

编辑:

你的代码结构有一些问题:

console.setForeground(Color.red);
console.setBounds(80,20,250,50);
add(console);

上面的代码是你设置控制台大小/位置的地方。所以基本上你忽略了文本字段的“首选大小”,只使用随机大小,如 (250, 50)。

此外,由于代码中的设计问题,文本字段只是偶然出现在该位置。

@Override
public void paint(Graphics g) 
{

    // render the image on the panel.
    g.drawImage(image, 0, 0, null);
    g.drawImage(turtleDisplay, xPos-TURTLE_X_SIZE/2, yPos-TURTLE_Y_SIZE/2, null);
}

您不应该重写 JFrame 的 paint() 方法。 JFrame 只是一个容器,不应包含任何应用程序逻辑。这样做会失去框架的默认功能,例如双缓冲和绘制子组件。

自定义绘画是通过覆盖 JPanel 的 paintComponent(...) 方法来完成的。然后第一个语句应该是super.paintComponent(..) 以确保使用默认的绘画功能。然后将面板添加到框架中。

然后您可以将您的文本字段添加到此面板,它会正常显示。

阅读 Custom Painting 上的 Swing 教程部分了解更多信息

【讨论】:

  • 嗨 camickr,感谢您的回复 :) 我最终把问题措辞错误,因为我的意思是说我想更改控制台的大小,因为当我输入时它太大了,因为它涵盖了海龟运动(如果有意义的话)。很抱歉给您带来不便
  • 嘿,我刚刚将上面的代码编辑到了 JPanel 版本。到目前为止一切顺利,但只有我的乌龟卡在左上角。我已经更新了代码以向您展示我的意思:)
  • @ben,看你已经“接受”了一个答案(尽管它不是很有帮助)。无论如何,您都不会四处更改整个问题。你有一个新问题,所以你问一个新问题。而且我仍然不会提供帮助,因为您仍然发布了太多代码。你被要求实现“一次一个功能”。所以首先你只是让运动向前发展。一旦可行,您尝试改变方向。所以摆脱所有不必要的代码。我们没时间看!!!
  • but just my turtle is stuck in the top left. 你为什么希望它移动?您还没有添加文本字段,也没有添加 ActionListener,因此用户无法移动海龟。我厌倦了重复我的建议 2 或 3 次。我给你的唯一提示是,如果你想让面板重新绘制自己,你需要在更改面板的属性时调用面板上的 repaint(),比如海龟的位置。
  • 抱歉,我一直在使用已经做过 turlte 动作等的人的框架。我只添加了 JPanel 并制作了应用程序。他们已经完成了命令和 TurtleDisplay
【解决方案2】:

试试这个代码。使用布局。 https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

//JTextField font colour//
console.setForeground(Color.red);
console.setBounds(80, 20, 250, 50);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(console)
);
layout.setVerticalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(console)
);

add(console);
setSize(200, 100);
setVisible(true);

抱歉,我只是忘记阅读您的完整评论。以下代码将修复 jtextfiled 的大小

//JTextField font colour//
        console.setForeground(Color.red);
        console.setBounds(80, 20, 250, 50);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(console, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 323, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(console, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 280, Short.MAX_VALUE))
        );

        add(console);
        setSize(200, 100);

【讨论】:

  • 感谢您的帮助,非常感谢!
  • @Ben,你试过调整你的框架吗?我敢打赌 JTextField 消失了。
  • @camickr 当我运行并调整大小时它确实消失了。是的。我现在遇到很多问题,想放弃
  • @Ben,好吧,我解释了你的问题,你不愿意花时间听我的建议和阅读教程。正如我在你的另一个问题中评论的那样,秘诀是在跑步之前学会走路。为什么你会在面板上显示图像之前编写所有的菜单代码。在为整个项目编写代码之前,编写小块代码并对其进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多