1

私は何百万もの異なる微妙な変更を何時間もグーグルで試してきましたが、すべて役に立ちませんでした.

データベースから一連のボタンをロードするクラスを作成しています。目標は、ユーザーが好みに合わせてボタンを配置できるようにすることですが、何らかの理由で、フレームを再検証できないようですまたは再塗装します。ボタンは移動しますが、コーディングしたように再配置されません。組織は正しく機能しているように見えます。つまり、マウス ボタンを離したときに再配置を行うコードは、コンポーネントがそれぞれのリストで再配置されているにもかかわらず、ドラッグ アンド ドロップされた場所にのみ留まります。

コードは長いです。一部の人をオフにする可能性があるため、クラス全体を投稿する必要はありませんでしたが、どこで間違いを犯しているのかわからないので、全部。主な関心領域はmouseReleased(MouseEvent e) {...}/repaint()メソッドrefresh()ですが、他の場所で見逃しているものがある可能性があります。

tl;dr: 基本的には、ユーザーが希望する順序でボタンをドラッグ アンド ドロップした後に実行しようとしてsetBounds()いますが、ボタンはドラッグ アンド ドロップされた同じ場所に留まり、revalidate()または実行されませんrepaint()removeAllコンポーネントのパネルをクリアしてリロードすることさえできません。

よろしくお願いします。これが私のコードです:

public class AdminButtonEditor extends javax.swing.JFrame {
    public AdminButtonEditor(OrderView parent) { ...
        ...
        Component[] components = buttonsPanel.getComponents();
        for (int i = 0; i < components.length; i++) {
            Component c = components[i];
            if (c instanceof JButton) {
                JButton jb = (JButton) c;
                jb.setFocusable(false);
                buttons.add(new MyJButton(...));
            }
        }
        for (int i = 0; i < buttons.size(); i++) {
            buttons.get(i).addTo(editPanel);
            buttons.get(i).orderIndex=modButtonList.get(i).menuModifier.getViewOrderValue();
            buttons.get(i).idx=i;
        }
        EventHandler eh = new EventHandler();
        addWindowListener(eh);
        editPanel.addMouseMotionListener(eh);
        editPanel.addMouseListener(eh);
        contentPane.add(editPanel, BorderLayout.CENTER);
    }
    protected void refresh() {
        if (!buttons.isEmpty() && buttons.get(0) != null) {
            contentPane.remove(editPanel);
            editPanel.removeAll();
            for (int i = 0; i < buttons.size(); i++) {
                MyJButton s = buttons.get(i);
                s.addTo(editPanel);
            }
            contentPane.add(editPanel, BorderLayout.CENTER);
            editPanel.repaint();
        }
    }
    public void paint(Graphics g) {
       refresh();
       super.paint(g);
    }
    private int getSelectionIndex(int x, int y) {
        int s=-1;
        for (int i=buttons.size()-1; i>=0;i--){
            if (buttons.get(i).contains(x, y)) {
                s = i;
                break;
            }
        }
        return s;
    }
private class EventHandler implements MouseInputListener,WindowListener, ActionListener {
    private int selectionIndex, startX, startY, lastX, lastY;
    private MyJButton selected;
    private boolean moving=false;
    ....
    ....
    public void mouseReleased(MouseEvent e) {
        if (moving){
            setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            moving=false;
            int dropX=e.getX();
            int dropY=e.getY();
            int row = dropY/selected.height;
            int col = dropX/selected.width;
            int idx=(row*3+col)-1;
            int oldIdx=buttons.indexOf(selected);
            insertIntoList(idx,oldIdx);
         }
        if (selected!=null){
            selected.unHighLight();
            selected=null;
        }

        Collections.sort(buttons);
        for (int i=0;i<buttons.size();i++){
        //modButtonList.get(buttons.get(i).idx).menuModifier.setViewOrderValue(buttons.get(i).orderIndex);
        }
        editPanel.validate();
        repaint();
    }

    private void insertIntoList(int idx, int oldIdx) {
        MyJButton temp = buttons.get(idx);
        int tempid=buttons.get(idx).idx;
        buttons.set(idx, new MyJButton(selected.text,selected.x,selected.y,selected.width,selected.height,selected.idx));
        buttons.get(idx).orderIndex=temp.orderIndex;
        if (idx<oldIdx){
            int id;
            for (int i=oldIdx;i>idx+1;i--){
                id=buttons.get(i).orderIndex;
                buttons.set(i, new MyJButton(buttons.get(i-1).text,buttons.get(i-1).x,buttons.get(i-1).y,buttons.get(i-1).width,buttons.get(i-1).height,buttons.get(i-1).idx));
                buttons.get(i).orderIndex=id;
            }
            id = buttons.get(idx+1).orderIndex;
            buttons.set(idx+1,new MyJButton(temp.text,temp.x,temp.y,temp.width,temp.height,temp.idx));
            buttons.get(idx+1).orderIndex=id;
        } else if (idx>oldIdx) {
            int id;
            for (int i=oldIdx;i<idx-1;i++){
                id=buttons.get(i).orderIndex;
                buttons.set(i, new MyJButton(buttons.get(i+1).text,buttons.get(i+1).x,buttons.get(i+1).y,buttons.get(i+1).width,buttons.get(i+1).height,buttons.get(i+1).idx));
                buttons.get(i).orderIndex=id;
            }
            id = buttons.get(idx-1).orderIndex;
            buttons.set(idx-1,new MyJButton(temp.text,temp.x,temp.y,temp.width,temp.height,temp.idx));
            buttons.get(idx-1).orderIndex=id;;
        } else {
            buttons.get(idx).x=buttons.get(idx).originx;
            buttons.get(idx).y=buttons.get(idx).originy;
        }
        repaint();
    }
    public void mouseDragged(MouseEvent e) {
        if (moving) {
            Graphics g = editPanel.getGraphics();
            g.setColor(Color.black);
            g.drawLine(selected.getXPos(), 0, selected.getXPos(),editPanel.getWidth());
            g.drawLine(0, selected.getYPos(), editPanel.getHeight(), selected.getYPos());
            selected.moveBy(e.getX()-lastX, e.getY()-lastY);
            g.setXORMode(Color.black);

            g.drawLine(selected.getXPos(), 0, selected.getXPos(), editPanel.getWidth());
            g.drawLine(0, selected.getYPos(), editPanel.getHeight(), selected.getYPos());

            lastX=e.getX();
            lastY=e.getY();
            repaint();
        }
    }
    ....
}
  private class MyJButton extends JButton implements Comparable {
    private int orderIndex,idx;
    private int x, y, width, height,originx,originy;
    private String text;
    public Border DEFAULT_BORDER;// new SoftBevelBorder(BevelBorder.RAISED);
    public Border SELECT_BORDER = BorderFactory.createLineBorder(Color.RED, 3, true);

    public MyJButton(String text, int x, int y, int width, int height) {
        ....
        setFocusable(false);
    }
    public MyJButton(String text, int x, int y, int width, int height,int idx) {....}

    public void addTo(JPanel p) {
        setBounds(x, y, width, height);
        p.add(this);
    }

    @Override
    public boolean contains(int x, int y) {
        int x1 = x, y1 = y;
        if (x1 >= this.x && y1 >= this.y && x1 <= this.x + width && y1 <= this.y + height) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void setSize(int w, int h) {
        width = w;
        height = h;
    }
    ....
    public void moveBy(int dx, int dy) {
        x += dx;
        y += dy;
    }

    @Override
    public void resize(int newWidth, int newHeight) {
        this.width = newWidth;
        this.height = newHeight;
        setBounds(x, y, width, height);
    }

    public int compareTo(Object o) {
        MyJButton mjb = (MyJButton)o;
        return this.idx-mjb.idx;
    }

  }
}
4

1 に答える 1