为什么矩形不会在我点击的地方绘制?

时间:2016-03-15 00:44:24

标签: java swing paintcomponent

这是绘制矩形的类。它应该使用静态整数x,y作为要绘制的矩形位置的组件,这是鼠标单击的x和y组件。 x,y来自event.getX()和event.getY()的Gui3类。程序及其所有方法都可以正常工作,唯一的问题是在绘制形状时出现。

绘制形状的类

Ext.define('MyApp.MyPanel', {
    extend: 'Ext.Panel',
    xtype: 'myForm',
    defaults: {
        padding: 10
    },

    viewModel: {  
        stores: {
            employeeStore: {
                fields: ['name'],
                data: [{
                    name: 'John'
                }, {
                    name: 'Tempel'
                }, {
                    name: 'George'
                }, {
                    name: 'Milinda'
                }]
            },
        }
    },
    items: [
        {
            xtype: 'combobox',
            fieldLabel: 'Name',
            name: 'nameField',
            queryMode: 'local',
            displayField: 'name',
            valueField: 'name',
            reference: 'emp',
            bind: {
                store: '{employeeStore}',
                value: '{name}'
            }
        },{
            xtype: 'dataview',
            itemId: 'empList',
            tpl: new Ext.XTemplate(
                '<tpl for=".">',
                    '<div class="dataview-multisort-item">',
                        '<h3>{name}</h3>',
                         '<tpl if="passed">Selected</tpl>',
                    '</div>',
                '</tpl>'
            ),
            itemSelector: 'div.dataview-multisort-item',

            bind: {
                store: '{employeeStore}'
            },

            prepareData: function(data, index, record) {
                 var name = this.up().getViewModel().get('name');
                 var passed = record.get('name') == name;
                 return Ext.apply({passed: passed}, data);
            }
        }
    ],

    initComponent: function() {
        this.callParent(arguments);
        var me = this;

        // refresh the dataview when name is changed.
        this.getViewModel().bind('{name}', function() {
            var dataview = me.down('#empList');
            dataview.refresh();
        });
    }
});

完成其他所有工作的主要课程

import java.awt.*;
import javax.swing.*;

public class DrawShapes extends JPanel {
    public static int x,y;
    public void paintComponent(Graphics g){
        g.setColor(Color.BLUE);
        g.fillRect(x,y,80,80);
    }
    public class GuiDemo extends Gui3{
        public GuiDemo(){
            x=x1;
            y=y1;
        }
        }

}

这是从

接收x和y分量的地方
 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;

public class Gui3 extends JFrame {
    private JPanel mousepanel;
    private JLabel statusbar;
    public static int x1=0, y1=0;
    public Gui3(){
        super("The title");

        mousepanel = new JPanel();
        mousepanel.setBackground(Color.WHITE);
        add(mousepanel, BorderLayout.CENTER);

        statusbar = new JLabel("Default");
        add(statusbar, BorderLayout.SOUTH);

        HandlerClass handler = new HandlerClass();
        mousepanel.addMouseListener(handler);
        mousepanel.addMouseMotionListener(handler);
    }   
    private class HandlerClass implements MouseListener, MouseMotionListener
        {
        @Override
        public void mouseClicked(MouseEvent event) {
            statusbar.setText(String.format("Clicked at %d, %d", event.getX(),event.getY()));

组件传递给DrawShapes类。 矩形只能在角落里绘制。只要我点击

,就应该画画

enter image description here

x1=event.getX();
y1=event.getY();

1 个答案:

答案 0 :(得分:4)

您在左上方看到矩形的原因是x yDrawShapes中的GuiDemo仅被分配一次,构建x1时;在那个时间点,y10都被初始化为x1。在点击后重新分配y1DrawShapes时,此更改永远不会传播回DrawShapes类。

我有几条建议:

  • 完全摆脱静态变量。将事物从一个对象传递到另一个对象更容易。 x应该有yDrawShapes,我会将它们设为私有(还有谁需要它们?)和非静态(如果您需要多个setPosition }})
  • DrawShapes添加public void setPosition(int newX, int newY) { this.x = newX; this.y = newY; repaint(); } 方法,以便您可以将此位置传达给将绘制矩形的对象:

    setPosition

    重绘非常重要(Java Swing为您管理了大量的绘图工作,但如果您正在进行自定义绘制,则需要在需要重绘时告知它。)

  • 发生点击时使用shapes.setPosition(event.getX(), event.getY());

    php.ini

警告:上面的代码未经测试,但我相信这会让你走上正确的道路。