Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JTable内でカーソルを移動させた場合

5列5行のJTableを1つ用意してマウスでカーソルをJTable内を移動させた場合に、例えば5行5列目のセルに矢印カーソルが置かれた時に0列目4行目のセルと0行目4列目のセルの色を変えて(例えば赤色)、該当セルのガイドとなるような方法はありませんでしょうか?

ネット検索で調べて見ましたが、該当セルをクリックした場合の方法は見つけられますが、カーソルが該当セルに置かれた状態の場合となると見つけられないので質問させて頂きました。

どうか、ご指導よろしくお願いします。

38

回答

9209

閲覧

38件の回答

評価

0

置いたの表現がわかりくいが…

ロールオーバー時ってこと?

いくつか拡張する必要はあるけど意外に
簡単に出来るよ。

1.MouseInputAdapterやMouseAdapterを使用する
※mouseMovedをオーバライドする
2.上記で作成したリスナーをJTableのマウスリスナーに登録する。

あとはイベント取得時にJTableのセルレンダラーに対して色替の処理を実行してやれば出来る。

評価

0

あああさん、回答いただきましてありがとうございます。
これから回答いただいた内容を調べてみます。

評価

0

あああさん、回答ありがとうございます。

> あとはイベント取得時にJTableのセルレンダラーに対して色替の処理を実行してやれば出来る。

補足ですが5行5列のjTableに1行目から4行目までと1列目から4列目までのセルにチェックボックスを表示させて、0行目0列目は各項目名を表示させています。

ある程度ご指摘通りにコードを記述できましたが、上記ご指摘の部分がよくわからずの状態ですが、自分なりに下記のようにコードを記述してみました。

以下のコードではセル内のチェックボックスをクリックした場合にのみ0行目が赤色に変わるだけで0列目は赤色にはなりません。
また、当方としては各セル上にカーソルが移動した場合に該当する0列目0行目の色を変えたいのですが、うまくコードが書けません。

下手なコードで申し訳ありませんが、どうかご指導宜しくお願いします。

@Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("ItemRecord(jTable)内でマウスが移動しました。");
        //1列目から6列目まで
        for(int i = 1; i <6; i++){
            //1行目から15行目まで
            for(int m = 1; m <15; m++){
                //列
                if(jTable0.isColumnSelected(i)){
                    //行
                    if(jTable0.isRowSelected(m)){
                        //カーソルがjTable内のセルを移動したら、そのセルに該当する0列目と0行目のセルのみを赤色に表示
         jTable0.getColumnModel().getColumn(0).setCellRenderer(new CellColorRenderer());
                    }
                }
            }
        }
    }



//セルレンダラ
public    class CellColorRenderer extends DefaultTableCellRenderer {
        private static final long serialVersionUID = 1L;

        @Override
        public Component getTableCellRendererComponent(final JTable table,
                final Object value, final boolean isSelected,
                final boolean hasFocus, final int row, final int column) {
            
                    this.setBackground(Color.red);

            return super.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, column);
        }
    }

評価

0

まずクリックしたときにしか処理が実行されないのはisColumnSelectedとisRowSelectedで判定しているから。

現在どの行のどのカラムのセルが選択されているのかは
Point point = e.getPoint();
int row = rowAtPoint(point);
int column = columnAtPoint(point);
とすると取れる。
※この辺はテーブル系のコンポーネントではほぼ実装されているから覚えておくと良い。
eはMouseEventね。
でrowAtPointとcolumnAtPointはJTableのメソッドね。

Swingとかは意外に色々なアプローチの手段があって
※様々なメソッドやコンポーネントからアクセス出来るので
色々と試してみて覚えるのもいいかもね。

評価

0

あああさん、回答をいただきましてありがとうございます。

ご指摘された内容を元に以下のようにコードを書き加えましたが。
実行してみると現状ではコンソールに
----------------------------------------------
ItemRecord(jTable)内でカーソルが移動しました。
12
5
----------------------------------------------
といったようにカーソルを置いたセルの行と列の番号が表示されるようになりました。

ですが、仮にコンソールに上記のように12行,5列とある場合の0行目と0列目の各セルの背景色を赤色に変える為の列と行を指定するコードがどうしてもわかりません。

下手なコードで申し訳ありませんが、どうか教えて下さい。
宜しくお願いします。

@Override
    public void mouseMoved(MouseEvent MouseEvent) {
        // TODO Auto-generated method stub
        System.out.println("ItemRecord(jTable)内でカーソルが移動しました。");
        
        Point point = MouseEvent.getPoint();
        int row = rowAtPoint(point);
        int column = columnAtPoint(point);
        
        System.out.println(jTable0.rowAtPoint(point));
        System.out.println(jTable0.columnAtPoint(point));
    }
    //列
    private int columnAtPoint(Point point) {
        // TODO Auto-generated method stub
        //0列目以外にカーソルがある場合に現在カーソル
        //がある列の0列目のセルの背景色のみを赤色に変える
        return 0;
    }
    //行
    private int rowAtPoint(Point point) {
        // TODO Auto-generated method stub
        //0行目以外にカーソルがある場合に現在カーソル
        //がある行のヘッダーセルの背景色のみを赤色に変える。
        return 0;
    }

評価

0

まず何が知りたいのかを具体的に知りたい。

1.ヒントを欲しい
2.全くやり方が想像付かないのでやり方を全部教えて欲しい
3.他の人の考えが知りたい(※あくまで参考程度に)

どれでもいいんだけど特に上記の2の場合はそもそも
Swingに取り掛かるには早いと思う。

前述でも言ったけど"Swingとかは意外に色々なアプローチの手段があって"と言っているようにひとつのやり方が正しいとは限らない。

で、初っ端に言っているようにJTableのセルコンポーネントを管理しているのはセルレンダラーです。

セルレンダラーに関する操作がわからないのであれば
参考になるサイトや書籍は山ほどある。

※誤解しないように言っておくと
Swingはある設計に基づいたフレームワークなる
思想に基づいて作成されているので
自分の設計思想をそのまま適用することも出来る。
つまり、基本的な動作なるものは提供するが
それがそぐわない場合には自身で置き換えていける。
→デザインパターンのテンプレートメソッドの思想
→オーバライドすることで処理を上書きできる。

評価

0

>int row = rowAtPoint(point);
>int column = columnAtPoint(point);
こう書いてる時点で、何をすればいいのかピンと来てない気がするなあ…。

評価

0

あああさん、$さん、回答有難う御座います。

今までJTableに関してばかり調べていましたが、これから「セルレンダラー」を調べてみます。

また、正直に言えば希望は「2」ですが、教わった
int row = rowAtPoint(point);
int column = columnAtPoint(point);
のrowやcolumnを使用することでセルの位置判定を行い、当方の希望する0列目と0行目のセルの背景色を変えると考えて間違いないでしょうか?

評価

0

あああさん、$さん、回答有難う御座います。

その後自分なりに考えて以下のようにしてみましたが、結果はJTableのセルにカーソルが置かれた途端にJTableのすべての行の0列目が赤色に変わりました。
また、JTableの行ヘッダーには何も起こりませんでした。

カーソルが置かれたセルの行の0列目のみ赤色に変えることと、カーソルが置かれたセルの行ヘッダーのセルを赤色に変えるにはどうしたらよいのでしょうか?

どうか教えて下さい。
宜しくお願いします。

@Override
public void mouseMoved(MouseEvent MouseEvent) {
    // TODO Auto-generated method stub
    System.out.println("ItemRecord(jTable)内でカーソルが移動しました。");
        
    Point point = MouseEvent.getPoint();
    int row = rowAtPoint(point);
    int column = columnAtPoint(point);
    
    //カーソルの位置(行)
    System.out.println(jTable0.rowAtPoint(point));
    //カーソルの位置(列)
    System.out.println(jTable0.columnAtPoint(point));
    
    // 行と列の同時選択を許可
      jTable0.setCellSelectionEnabled(true);
    // 行を選択できるかどうかを設定します。
        jTable0.setRowSelectionAllowed(true);     // デフォルトはtrue
        // 列を選択できるかどうかを設定します。 
        jTable0.setColumnSelectionAllowed(true);  // デフォルトはtrue

}

//行のメソッド
private int rowAtPoint(Point point) {
    // TODO Auto-generated method stub
    //0行目以外にカーソルがある場合に現在カーソル
    //がある行の0列目のセルの背景色のみを赤色に変える

    jTable0.getTableHeader().getColumnModel().getColumn(0).setCellRenderer(new CellColorRenderer());
    return 0;
}
        
//列のメソッド
private int columnAtPoint(Point point) {
    // TODO Auto-generated method stub
    //0列以外にカーソルがある場合に現在カーソル
    //がある列のヘッダーセルの背景色のみを赤色に変える。
    
    jTable0.getColumnModel().getColumn(0).setCellRenderer(new CellColorRenderer());
    return 0;
}

以下はCellColorRendererです。
import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

//セルカラーレンダラ
public    class CellColorRenderer extends DefaultTableCellRenderer {
    private static final long serialVersionUID = 1L;

    @Override
    public Component getTableCellRendererComponent(final JTable table,
        final Object value, final boolean isSelected,
        final boolean hasFocus, final int row, final int column) {
            
            this.setBackground(Color.red);

    return super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);
    }
}

評価

0

selectionだけでやろうとしたら、C1とA3を(Excel風に)選択しようとしてるのにC3とA1まで選択対象になってしまうな(4つ選択される)。
行と列の二重管理になってることが影響してるようで、不具合に近い仕様だと思われ。

やりたいことと同じかどうか分からないし、もっとシンプルなやり方あるかも。

public class JTable2 extends JTable implements MouseMotionListener, MouseListener {
    private int sColumn, sRow;

    public JTable2(int numRows, int numColumns) {
        super(numRows, numColumns);
        setDefaultRenderer(Object.class, new CellColorRenderer());
        addMouseMotionListener(this);
        addMouseListener(this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {}
    @Override
    public void mousePressed(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {
        sRow = sColumn = -1;
        repaint();
    }

    @Override
    public void mouseDragged(MouseEvent e) {}

    @Override
    public void mouseMoved(MouseEvent e) {
        sRow = rowAtPoint(e.getPoint());
        sColumn = columnAtPoint(e.getPoint());
        repaint();
    }

    private class CellColorRenderer extends JLabel implements TableCellRenderer {
        public CellColorRenderer() {
            setOpaque(true);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setBackground((row == sRow && column == 0) || (column == sColumn && row == 0) ? Color.RED : Color.WHITE);
            setText((value == null) ? "" : value.toString());
            return this;
        }
    }
}

評価

0

$さん、回答をいただきましてありがとうございます。

これからサンプルコードをよく見て試してみようと思います。

評価

0

私も$氏と似たようなもんですけどね。
ポイントとしてはロールオーバー時の
マウス座標(column, row)を覚えておくのと
JLabel(※他の代用コンポーネントでもOK)ってのと
ぐらいかな。

import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.TableCellRenderer;

/**
 * ロールオーバーテーブル
 */
@SuppressWarnings("serial")
class RollOverTable extends JTable {
    
    private int selColumn = -1;
    private int selRow = -1;
    
    /**
     * コンストラクタ
     * @param row
     * @param column
     */
    public RollOverTable(int row, int column) {
        super(row,column);
        setDefaultRenderer(Object.class, new CellColorRenderer());
        RollOverListener rol = new RollOverListener();
        addMouseMotionListener(rol);
        addMouseListener(rol);
    }
    
    /**
     * マウスイベントリスナー
     */
    private class RollOverListener extends MouseInputAdapter {
        @Override 
        public void mouseExited(MouseEvent e) {
            selColumn = -1;
            selRow = -1;
            repaint();
        }
        @Override 
        public void mouseMoved(MouseEvent e) {
            Point point = e.getPoint();
            int row = rowAtPoint(point);
            int column = columnAtPoint(point);
            if(row != selRow || column != selColumn) {
                selColumn = column;
                selRow = row;
                repaint();
            }
        }
    }
    
    /**
     * セル色変レンダラー
     */
    private class CellColorRenderer extends JLabel implements TableCellRenderer {
        public CellColorRenderer() {
            setOpaque(true);
        }
        @Override
        public Component getTableCellRendererComponent(JTable table,
                                                       Object value,
                                                       boolean isSelected,
                                                       boolean hasFocus,
                                                       int row,
                                                       int column) {
            if ((column == selColumn && row == 0 && selRow != 0)
                   || (row == selRow && column == 0 && selColumn != 0)) {
                setBackground(Color.RED);
            } else {
                setBackground(Color.WHITE);
            }
            return this;
        }
    }
}

評価

0

もっと簡潔に書くなら以下でもOK
※但し、純粋なセルレンダラーなので汎用性は低いけど

/**
     * セル色変レンダラー
     */
    private class CellColorRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table,
                                                       Object value,
                                                       boolean isSelected,
                                                       boolean hasFocus,
                                                       int row,
                                                       int column) {
            if ((column == selColumn && row == 0 && selRow != 0)
                   || (row == selRow && column == 0 && selColumn != 0)) {
                setBackground(Color.RED);
            } else {
                setBackground(Color.WHITE);
            }
            return super.getTableCellRendererComponent(table,
                                                       value,
                                                       isSelected,
                                                       hasFocus,
                                                       row,
                                                       column);
        }
    }

評価

0

$さん、あああさん、何度も回答をいただきましてありがとうございます。
今回はあああさんがご提示いただいたサンプルコードを参考にしてコードを記述してみました。
また、$さんがご提示いただいた貴重なサンプルコードは今後の参考になりますのでファイルに保存しておきます。
以下は私が現在コードを記述しているItemRecord.javaなんですが、エラーが出なくなっただけですが実行してみると「セル色変レンダラー」が機能していない状態です。
あああさんのコードではextends JTableとなっていますが当方ではexetends JDialogとしていて、JFrameの代わりにJDialogを使用しJTableを表示しています。
あああさんのご提示していただいたサンプルコードを追加&自前のコードを修正していきましたが、exetends JTableとしてはいないのでコンストラクタの
public RollOverTable(int row, int column) {
    super(row,column);
}
をどう書き換えたら動作するのか知識不足と力量不足で分かりません・・・。
どうにも下手で冗長で大変お見苦しいコードかとは思いますが、また何度も質問を繰り返してしまい大変申し訳ありませんが是非コードをご覧になってご意見をお願いします。
よろしくお願いします。
public class ItemRecordfrm extends JDialog {
    private int selColumn = -1;
    private int selRow = -1;
    private static final long serialVersionUID = 1L;
    private JTable jTable0;
    private JScrollPane jScrollPane0;
    private static final String PREFERRED_LOOK_AND_FEEL = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
    
    public ItemRecordfrm() {
        initComponents();
    }
    public ItemRecordfrm(Frame parent) {
        super(parent);
        initComponents();
    }
    public ItemRecordfrm(Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }
    public ItemRecordfrm(Frame parent, String title) {
        super(parent, title);
        initComponents();
    }
    public ItemRecordfrm(Frame parent, String title, boolean modal) {
        super(parent, title, modal);
        initComponents();
    }
    public ItemRecordfrm(Frame parent, String title, boolean modal,
            GraphicsConfiguration arg) {
        super(parent, title, modal, arg);
        initComponents();
    }
    public ItemRecordfrm(Dialog parent) {
        super(parent);
        initComponents();
    }
    public ItemRecordfrm(Dialog parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }
    public ItemRecordfrm(Dialog parent, String title) {
        super(parent, title);
        initComponents();
    }
    public ItemRecordfrm(Dialog parent, String title, boolean modal) {
        super(parent, title, modal);
        initComponents();
    }
    public ItemRecordfrm(Dialog parent, String title, boolean modal,
            GraphicsConfiguration arg) {
        super(parent, title, modal, arg);
        initComponents();
    }
    public ItemRecordfrm(Window parent) {
        super(parent);
        initComponents();
    }
    public ItemRecordfrm(Window parent, ModalityType modalityType) {
        super(parent, modalityType);
        initComponents();
    }
    public ItemRecordfrm(Window parent, String title) {
        super(parent, title);
        initComponents();
    }
    public ItemRecordfrm(Window parent, String title, ModalityType modalityType) {
        super(parent, title, modalityType);
        initComponents();
    }
    public ItemRecordfrm(Window parent, String title,
            ModalityType modalityType, GraphicsConfiguration arg) {
        super(parent, title, modalityType, arg);
        initComponents();
    }
    private void initComponents() {
        setTitle("記録項目");
        setFont(new Font("Dialog", Font.PLAIN, 12));
        setBackground(Color.white);
        setForeground(Color.black);
        setLayout(new GroupLayout());
        add(getJScrollPane0(), new Constraints(new Leading(-1, 257, 10, 10), new Leading(-1, 262, 10, 10)));
        setSize(256, 260);
        setResizable(false);
        MsetodalityType(Dialog.ModalityType.APPLICATION_MODAL);
    }
    private JScrollPane getJScrollPane0() {
        if (jScrollPane0 == null) {
            jScrollPane0 = new JScrollPane();
            TableColumn col0 = getJTable0().getColumnModel().getColumn(0);
            col0.setMinWidth(122);
            col0.setMaxWidth(122);
            TableColumn col1 = getJTable0().getColumnModel().getColumn(1);
            col1.setMinWidth(26);
            col1.setMaxWidth(26);
            TableColumn col2 = getJTable0().getColumnModel().getColumn(2);
            col2.setMinWidth(26);
            col2.setMaxWidth(26);
            TableColumn col3 = getJTable0().getColumnModel().getColumn(3);
            col3.setMinWidth(26);
            col3.setMaxWidth(26);
            TableColumn col4 = getJTable0().getColumnModel().getColumn(4);
            col4.setMinWidth(26);
            col4.setMaxWidth(26);
            TableColumn col5 = getJTable0().getColumnModel().getColumn(5);
            col5.setMinWidth(26);
            col5.setMaxWidth(26);
            TableColumnModel tcm = jTable0.getColumnModel();
            JCheckBox chbox0 = new JCheckBox("",false);
            for (int l = 1; l < 6; l++){
                tcm.getColumn(l).setCellRenderer( new CheckBoxRenderer());
                tcm.getColumn(l).setCellEditor(new DefaultCellEditor(chbox0));
            }    
        jScrollPane0.setViewportView(getJTable0());
        }
        return jScrollPane0;
    }
    public JTable getJTable0() {
        if (jTable0 == null) {
            jTable0 = new JTable(15,7);
            Table0.setDefaultRenderer(Object.class, new CellColorRenderer());
            RollOverListener rol = new RollOverListener();
            jTable0.addMouseMotionListener(rol);
                jTable0.addMouseListener(rol);
                jTable0.setRowHeight(17);
            JTableHeader header = jTable0.getTableHeader();

            Dimension dim = header.getPreferredSize();
            dim.height = 18;

            header.setPreferredSize(dim);
            JTableHeader hd = getJTable0().getTableHeader();
            hd.setReorderingAllowed(false);
            hd.setDefaultRenderer(new HeaderRenderer(hd.getDefaultRenderer()));
            
            jTable0.setModel(new DefaultTableModel(new Object[][] {
                    { "2Pシュート成功",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false), },
                    { "2Pシュート失敗",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false), },
                    { "3Pシュート成功",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    { "3Pシュート失敗",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    { "フリースロー成功",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false), },
                    { "フリースロー失敗",   new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    { "OFFリバウンド",   new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    { "DEFリバウンド",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    { "アシスト",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    { "スティール",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    { "ターンオーバー",   new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    { "ブロックショット",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false), },
                    { "ファウル",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    { "選手交代",  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),  new Boolean(false),},
                    }, new String[] { "選手背番号", "4", "25", "99", "7", "32",}) {
                private static final long serialVersionUID = 1L;
                Class<?>[] types = new Class<?>[] 
                    { Object.class, Object.class, Object.class, Object.class, Object.class, Object.class,};
    
                public Class<?> getColumnClass(int columnIndex) {
                    return types[columnIndex];
                }
            });
            jTable0.setShowGrid(true);
            jTable0.setGridColor(Color.gray);
            jTable0.setBackground(Color.WHITE);
            jTable0.getColumnModel().getColumn(0).setCellRenderer(new Renderer());
        }
        return jTable0;
    }
    @SuppressWarnings("unused")
    private static void installLnF() {
        try {
            String lnfClassname = PREFERRED_LOOK_AND_FEEL;
            if (lnfClassname == null)
                lnfClassname = UIManager.getCrossPlatformLookAndFeelClassName();
            UIManager.setLookAndFeel(lnfClassname);
        } catch (Exception e) {
            System.err.println("Cannot install " + PREFERRED_LOOK_AND_FEEL
                    + " on this platform:" + e.getMessage());
        }
    }
    public static void main(String[] args) {
        installLnF();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                ItemRecordfrm dialog = new ItemRecordfrm();
        dialog.setDefaultCloseOperation(ItemRecordfrm.DISPOSE_ON_CLOSE);
                dialog.setTitle("ItemRecordPfrm");
                dialog.setLocationRelativeTo(null);
            dialog.getContentPane().setPreferredSize(dialog.getSize());
                dialog.pack();
            dialog.setVisible(true);
            }
        });
    }
  private class RollOverListener extends MouseInputAdapter {
      @Override
      public void mouseClicked(MouseEvent e) {
          // TODO Auto-generated method stub
          System.out.println("ItemRecord(jTable)の各セル内のチェックボックスがチェックされました。");
      }
      @Override 
      public void mouseExited(MouseEvent e) {    
          selColumn = -1;
          selRow = -1;
          repaint();
      }
      @Override 
      public void mouseMoved(MouseEvent e) {
          Point point = e.getPoint();
          System.out.println("ItemRecord(jTable)内でカーソルが移動しました。");
     System.out.println(jTable0.rowAtPoint(point));
       System.out.println(jTable0.columnAtPoint(point));
     int row = jTable0.rowAtPoint(point);
          int column = jTable0.columnAtPoint(point);
          if(row != selRow || column != selColumn) {
              selColumn = column;
              selRow = row;
              repaint();
     }
      }
  }
  private class CellColorRenderer extends JLabel implements TableCellRenderer {
    private static final long serialVersionUID = 1L;
        public CellColorRenderer() {
          setOpaque(true);
      }
      @Override
      public Component getTableCellRendererComponent(JTable,table,Object,value,boolean,isSelected,        boolean,hasFocus,int row,int column) {
          if ((column == selColumn && row == 0 && selRow != 0)
                 || (row == selRow && column == 0 && selColumn != 0)) {
              setBackground(Color.RED);
          } else {
              setBackground(Color.WHITE);
          }
          return this;
      }
  }
}    

評価

0

自分で意味を説明できないコードを書くからそう
いうことになるんじゃないのかね。
「サンプルコードを参考にして」とは言うが、サ
ンプルの本質が理解できなければ参考にすること
もできない。
それができれば、あああ氏のコードと私のコード
は、実質的には同じもの(やってることは同じ)
だと解るだろう。

Swingがどうというよりは、もう少し基本的な、
構造や流れを考える力がまだないようだ。
それから、他者の書いたコードを読む力かな。

もっと簡単なものをたくさん作れるようになって
から、臨むべきだと思う。
あれらサンプルがあってなお解らないとすると、
単純に「手に余る」状態だ。

評価

0

$さん、あああさん、回答ありがとうございます。

自分には手に余る状態かもしれませんが、なんとかこれを完成させたいですしまた作りたいものがこれしか頭に浮かばないのです。

その後自分なりに考えてあああさんのコードを改変してRollOverTable.javaとして同じpackage内に収めました。

この状態でItemRecordfrmのmainメソッド内でnewしましたが、
RollOverTable rot = new RollOverTable(15,6);
rot.???
以降をどう記述したらよいのか具体的な方法がわかりません。
引数を(15,6)としたのはItemRecordfrm内のjTable0が15行6列だからです。

おかしなコードなのかもしれませんが、どうかご指導お願いします。

/**
 * ロールオーバーテーブル
 */
@SuppressWarnings("serial")
public class RollOverTable extends ItemRecordfrm {
    
    private int selColumn = -1;
    private int selRow = -1;
    
    /**
     * コンストラクタ
     * @param row
     * @param column
     */
    public RollOverTable(int row, int column) {
        super();
        ItemRecordfrm.jTable0.setDefaultRenderer(Object.class, new CellColorRenderer());
        RollOverListener rol = new RollOverListener();
        addMouseMotionListener(rol);
        addMouseListener(rol);
    }

    /**
     * マウスイベントリスナー
     */
    private class RollOverListener extends MouseInputAdapter {
        @Override 
        public void mouseExited(MouseEvent e) {
            selColumn = -1;
            selRow = -1;
            repaint();
        }
        @Override 
        public void mouseMoved(MouseEvent e) {
            Point point = e.getPoint();
            int row =  ItemRecordfrm.jTable0.rowAtPoint(point);
            int column =  ItemRecordfrm.jTable0.columnAtPoint(point);
            if(row != selRow || column != selColumn) {
                selColumn = column;
                selRow = row;
                repaint();
            }
        }
    }
    
    /**
     * セル色変レンダラー
     */
    private class CellColorRenderer extends JLabel implements TableCellRenderer {
        public CellColorRenderer() {
            setOpaque(true);
        }
        @Override
        public Component getTableCellRendererComponent(JTable table,
                                                       Object value,
                                                       boolean isSelected,
                                                       boolean hasFocus,
                                                       int row,
                                                       int column) {
            if ((column == selColumn && row == 0 && selRow != 0)
                   || (row == selRow && column == 0 && selColumn != 0)) {
                setBackground(Color.RED);
            } else {
                setBackground(Color.WHITE);
            }
            return this;
        }
    }
   
}

評価

0

基礎はやりたいかやりたくないかではない。
つまらなくてもやる人だけが、本当にやりたいこ
とをできるようになる。
(異常な天才はともかく、君や私のような普通の
人間は)

コードについては、もう言うことはないな。
「答え」を教えてくれる人がいるかも知れない
が、力にはならないよ。

評価

0

また質問させてください。
その後基礎を学び直したのですが、どうしても「あああさん」が提示していただいたサンプルコードを自前のコードに組み入れることができません。
このロールオーバー機能は現在プログラミングを行なっている他のいくつかのJTableでも使いますのでどうしても必要なんです。
何度何度もも質問して申し訳ありませんが教えて下さい。
どうぞ宜しくお願いします。

評価

0

一体何がそんなにわからないの?
わからないことがわからないんだけど…

基礎を学び直したのにわからないの?
じゃあもう一回基礎を学び直してください。

・自前のコードって何?
推測しろってこと?

・他のいくつかの?
推測しろってこと?

まず、
 1:自分が何をどうした(してみた)のか
 2:自分が何がしたく
 3:自分が何がわからないのかを
箇条書きでもいいので教えてください。

1:【実行】
2:【要求】
3:【質問】

評価

0

あああさん、回答ありがとうございます。

早速ですが
1:【実行】現状では提示していただいたサンプルコードを自分が書いたコードに追加した後に、JTableに関するブロック内でnewして使えるようにすれば良いと考えて
addMouseListener(new RollOverTable(15,7));
addMouseMotionListener(new RollOverTable(15,7));
としてみたのですが、1行目&2行目の下部に赤い波線が入り、「MouseMotionListenerとMouseListenerをRollOverTabeに実装せよ」と出ましたので、
class RollOverTable extends JTable implements MouseMotionListener,MouseListener {
とすると今度はRollOverTableの下部に赤い波線が入り、「実装されていないメソッドの追加」とあるのでメソッドを追加して、各メソッドにサンプルコードで提示されたオーバーライドの内容を記述しました。
実行させると提示されたサンプルコードのRollOverListenerやCellColorRendererがまったく動作していない状態が現状です。

2:【要求】サンプルとして提示していただいたJTableのロールオーバー機能の実装するには?

3:【質問】間違っているかもしれませんが、前述の「1:」もしくは
RollOverTable rot = new RollOverTable(15,7);
addMouseListener(rot);
addMouseMotionListener(rot);
のようにしか思いつかないので、具体的にサンプルコードを実装するにはどうしたらよいのかがわからないのです。

他で質問したのではマルチポストになりますし、周囲に質問できる方もいません。
どうか教えて下さい。
宜しくお願いします。

評価

0

正直に言いましょう。

基礎からやり直したほうがいいよ。
>addMouseListener(new RollOverTable(15,7));

なぜ、こんな記述になるのかがわからない。
そして、エラーの内容を全く把握していないよね?
単純にエラーが出たからそれを揉み消そうとしているようにしか見えない。

教えるのは簡単だけど絶対にこんな調子じゃ理解出来ないと思うし、理解しないまま提示されたコードを貼り付けて
「あっ、動いた動いた」で終わると思う。

Listenerってものが何なのか、どうしてインターフェースなのか、そして以前に提示されたサンプルが一体どういった実装がされていて何をしているのかをもう一度よく考えてみてください。

上記、質問だけ見ているとSwingどうこうよりもやっぱ基礎がなってないようにしか見えない。

評価

0

あああさん、回答ありがとうございます。
遅くなりましたが、ご指示通りこれから再度基礎を学びます。

評価

0

>その後基礎を学び直したのですが、
残念ながら大して、あるいは全く理解が進んでな
いんだろう、という印象。
先に進みたくて仕方ない人間にとって、基礎とい
うのは本当につまらないものだと思う。
ただ、すべての応用はその基礎がなければ成り立
たず、理解もできない。「一通りやった」と思っ
たのにまだ理解できないのは、やはり基礎が固ま
っていないから。

「自分なりに頑張っているのに」と、悔しい思い
もあるかも知れない。しかし、あああ氏もそうだ
と思うが、単に完成させるより、ちゃんと自力で
作れるようになってもらいたい、と思っている。
お節介とも言えるが、どちらかというと、「これ
からも基礎的なことを質問し続けるかもしれな
い」という考えもある。

「教えるのが当然」と考える人間もいるようだ
が、そういう人間は…止めておくほうが身のため
だろう。

評価

0

あああさん、$さん、ご助言ありがとうございます。
そして何度も投稿を繰り返してしまい大変申し訳ありません。
その後再び基礎をやり直し、自分が理解できるようご提示いただいたサンプルコードにコメントを付けてみました。
コードがごちゃごちゃしてしまい大変わかりづらいですが以下で間違っていないでしょうか?
マルチポストは避けたいですし、周囲に聞ける方もいないので投稿しました。
よろしくお願いします。

/**
 * ロールオーバーテーブル
 */
@SuppressWarnings("serial")
//デフォルトアクセスのクラスでJTableを継承。
class RollOverTable extends JTable {
    
    //フィールド変数(整数型)selColumnに-1を代入、privateなので他のクラスからのアクセス不可
    private int selColumn = -1;
    //フィールド変数(整数型)selRowに-1を代入、privateなので他のクラスからのアクセス不可
    private int selRow = -1;
    
    /**
     * コンストラクタ
     * @param row
     * @param column
     */
    //引数が2つのコストラクタ(整数型 rowと整数型column)
    public RollOverTable(int row, int column) {
        //サブクラスでスーパークラスのコンストラクタを使用したい場合はsuperを使用(ここでのスーパークラスはJTable)、引数アリ。
    super(row,column);
    //あるセルが描画されるとき、設定されたTableCellRendererのgetTableCellRendererComponentメソッドが呼び出される。レンダラーは、引数などから得られる情報(選択されているか、何行何列目かなど)を使って、コンポーネントを修飾してからreturnする。
        setDefaultRenderer(Object.class, new CellColorRenderer());
        //RollOverListener型のオブジェクト「rol」を作成(引数なし)
        RollOverListener rol = new RollOverListener();
    //リスナーの登録(引数rol)コンポーネント上のマウスモーションイベントを受け取るためのリスナーインタフェース
        addMouseMotionListener(rol);
    //リスナーの登録(引数rol)コンポーネント上の「関連する」マウスイベント (プレス、リリース、クリック、コンポーネントへの出入り) を受け取るためのリスナーインタフェース
        addMouseListener(rol);
    }
    
    /**
     * マウスイベントリスナー
     */
    //MouseInputAdapterを継承しているクラスで必要なメソッドだけを拡張して実装することによって、リスナーの作成処理を簡略化する。
    private class RollOverListener extends MouseInputAdapter {
        //オーバーライド
    @Override 
        //コンポーネントの外にマウスカーソルが出るときに呼ばれる。
    public void mouseExited(MouseEvent e) {
        //変数selColumnに-1を代入
            selColumn = -1;
            //変数selRowに-1を代入
        selRow = -1;
            //再度表示が必要になった時には自動的に呼び出される。
            repaint();
        }
    //オーバーライド
        @Override 
    //コンポーネント上でマウスを動かしたときに呼ばれる。
        public void mouseMoved(MouseEvent e) {
        //Pointクラスには2つのフィールドが用意されており、Pointクラスのオブジェクトが保持しているx座標及びy座標はこのフィールドを参照することで取得する。
            Point point = e.getPoint();
      //point が存在する場合はその行のインデックス、結果が [0, getRowCount()-1] の範囲内にない場合は -1 を返す。変数rowに引数pointを代入
            int row = rowAtPoint(point);
        //  point が存在する場合はその列のインデックス、結果が [0, getColumnCount()-1] の範囲内にない場合は -1 を返す。変数columnに引数pointを代入
            int column = columnAtPoint(point);
        //もし、変数rowの値がselRowと同一ではなく、または変数colmnの値がselColumnの値が同一でない場合
            if(row != selRow || column != selColumn) {
        //変数columnの値を変数selColumnに代入。
                selColumn = column;
        //変数rowの値を変数selRowに代入。
                selRow = row;
        //再度表示が必要になった時には自動的に呼び出される。
                repaint();
            }
        }
    }
    
    /**
     * セル色変レンダラー
     */
  //JLabelを継承し、TableCellRendererインターフェイスを実装する。
    private class CellColorRenderer extends JLabel implements TableCellRenderer {
        //コンストラクタ
    public CellColorRenderer() {
        //ラベルに設定した背景色を有効にしたければ、opqにtrue 、透明にするときは、 false を指定。他のコンポーネントと異なり、ラベルは初期値が透明になっている。 
            setOpaque(true);
        }
    //オーバーライド
    @Override
    //セルを描画するのに使用されるコンポーネントを返す。描画する前に、このメソッドを使ってレンダリングを適切に設定する。 
        public Component getTableCellRendererComponent(JTable table,
                                                       Object value,
                                                       boolean isSelected,
                                                       boolean hasFocus,
                                                       int row,
                                                       int column) {
      //もし、変数columnの値と変数selColumnの値が同一で、かつ変数rowの値が0かつ変数selRowの値が0ではなく、
            if ((column == selColumn && row == 0 && selRow != 0)
          //または変数rowの値が変数selRowの値が同一で、かつ変数columnの値が0かつ変数selColumnの値が0でない場合
                   || (row == selRow && column == 0 && selColumn != 0)) {
                //セルの背景を赤色にする。
        setBackground(Color.RED);
      //そうでない場合
            } else {
        //セルの背景を白色にする。
                setBackground(Color.WHITE);
            }
        //オブジェクト自身の参照を返す。
            return this;
        }
    }
}

評価

30

以下のようにしてみましたところ、コンソールにマウスが置かれている行や列の位置などは表示されますが、肝心の「セル色変レンダラー」がまったく機能していない状態です。
どうか教えて下さい。
宜しくお願いします。

public JTable getJTable0() {
        if (jTable0 == null) {
            jTable0 = new RollOverTable(15,7);

評価

0

ユーザ登録ができたか。広告を消すのが面倒になったかな。

さて…。
なんだろうな。

クラスの行単位の意味を考えるのは、無意味だとは言わないが本質じゃない。
誰も行単位の意味を理解できないほどの初心者だとは思ってない。

肝心なのは、メソッド単位、クラス単位での意味と使い方を理解することで、中身
を見ないでも使えるのがオブジェクト指向の目指すところだ。
(巷に溢れているライブラリには、ソースが公開されていないものも多い)

とくに継承クラスであれば、親クラスやインターフェイスの使い方を理解すれは使
える(親クラスを使ったコードがあったら、クラス生成だけ変えればそのまま動
く)べきだ。
もちろん、あああ氏も私も、そういう考えでサンプルを書いている。

こういう考え方が身についていないのが、「基礎が理解できてない」と評価される
要因だ。

評価

0

そういえば以前、インターフェイスの実装において、仕様はどれだけ維持すべき
か、という議論があったが、面白いクラスを見つけた。
commons.collectionsをGenerics対応させたスピンオフ版の中にBagというクラスが
あるが、Collection実装であるにも拘わらず同一要素は1つしか保持しておらず、
CollectionというよりSetになっている。

https://github.com/megamattron/collections-
generic/blob/master/src/java/org/apache/commons/collections15/Bag.java
https://github.com/megamattron/collections-
generic/blob/master/src/java/org/apache/commons/collections15/bag/AbstractMapBa
g.java

評価

0

> addMouseListener(new RollOverTable(15,7));
> addMouseMotionListener(new RollOverTable(15,7));



addMouseListener(new RollOverTable(this));
addMouseMotionListener(new RollOverTable(this));

だろ。?

この説明でわからなかったら Javaの基礎本 100回読み直すんだ

表示している


--------------------------

なつかしいな > Bug

いくつ存在するかチェックするためのコレクション。



※id-pass は 5年ぐらいまえに管理者につっこんだのが昨今のアタックでよ
うやく腰を上げたか。

評価

0

$さん、あさん、あああさん、回答をいただきまして本当にありがとうございます。

JTableのロールオーバーですが動作しました。
ご提示いただいたサンプルコードが動作しなかったのはJTableの0行目にはレンダラを使用していたのが原因でこれを変更することで正常動作しました。

また、回答をして下さった皆さんには大変申し訳ないのですが私はたいへん大きな間違いをしていました。
それは「JTableでロールオーバーした場合に0行目と0列目のセルカラーを変更するには?」と質問を繰り返していましたが、実は「0行目とヘッダーセル」のセルカラーの変更が希望でした。
ご迷惑をおかけしてしまい本当に申し訳ありません。

そこでご提示いただいたサンプルコードを以下のように改変してみましたが、これではJTableの0行目をロールオーバーした場合にJTableの0行目の0列目のセルカラーも同時に変わってしまいます。

幾度と無く質問を繰り返してしまい大変申し訳ありませんが、JTableのロールオーバー時に0行目とヘッダーセルカラーを変更するにはどうしたらよいのか教えてください。
宜しくお願いします。

/**
     * セル色変レンダラー
     */
    private class CellColorRenderer extends JLabel implements TableCellRenderer {
        
        public CellColorRenderer() {
            //フォントサイズ
            setFont(new Font("Dialog", Font.PLAIN, 15));
            setOpaque(true);
        }
        @Override
        public Component getTableCellRendererComponent(JTable table,
                                                       Object value,
                                                       boolean isSelected,
                                                       boolean hasFocus,
                                                       int row,
                                                       int column) {
            /*2012.01.29---この文を追加*/
            this.setText( value.toString() );
       
            if ((column == selColumn && row == 0 && selRow != 0)
                    || (row == selRow && column == 0 && selColumn != 0)) {
                    setBackground(new Color(255,51,51));//明るい赤色
            } else {
                    setBackground(Color.WHITE);
            }
            //ヘッダーのセルカラーを変える
            if( row == selRow ){
                setBackground(new Color(255,51,51));
            }
            return this;
           }
    }

評価

0

勉強する気がないようにしか読めないな。

評価

0

やる気がないんじゃない?
ゆとり専門学校の課題?卒研?みたいだし。

評価

0

なんかここまで来ると確信犯のような気がしてきた。

評価

0

皆さん回答ありがとうございます。
それと課題でも何でもなく本当に独学中なんです。

その後調べなおしてJTableとJTableHeaderは別のコンポーネントなことがわかりました。そこで以下のようにコードを書き直し
private void initComponents() 
に以下のコードを配置してみましたがヘッダーの変色はしませんでした。
どうか教えて下さい。
宜しくお願いします。

JTableHeader header = jTable0.getTableHeader();
        jTable0.getTableHeader().setDefaultRenderer( new HeaderColorRenderer( header.getDefaultRenderer() ) );

    /**
     * セル色変レンダラー
     */
    private class CellColorRenderer extends JLabel implements TableCellRenderer {
        
        public CellColorRenderer() {
         
            setOpaque(true);
        }
    
        @Override
        public Component getTableCellRendererComponent(JTable table,
                                                       Object value,
                                                       boolean isSelected,
                                                       boolean hasFocus,
                                                       int row,
                                                       int column) {
            setText( value.toString() );

            if( row == selRow && column == 0 && selColumn != 0 ){
                setBackground(Color.RED);
            } else {
                setBackground(Color.WHITE);
            }
            return this;
        }
    }
}
/**
* ヘッダーセル色変レンダラー
*/
class HeaderColorRenderer implements TableCellRenderer{
    
  private int selColumn = -1;
    private TableCellRenderer delegate;

    public HeaderColorRenderer(TableCellRenderer delegate ){
        this.delegate = delegate;
    }

    @Override
    public Component getTableCellRendererComponent( JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column ){
        Component component = delegate.getTableCellRendererComponent( table, value, hasFocus, hasFocus, row, row ) ;

        if( column == selColumn ){
            component.setBackground( Color.RED );
        }
        return component;
    }
}

評価

0

もうなんていうか、基礎の本 擦り切れるまで読み直したほうがいいよ。

評価

0

わざとでなく、勉強する気もあるというなら、基礎云々ではなく本当にセンスがな
い人なのかも知れない。
今まで直接顔を合わせた人間の中にも、数人がかりで説明してもどうしてもダメだ
った人はいた。
もしそうなら可哀想だが、対処のしようがない。
掲示板で回答する側には、なんの義務も責任もないのだから。

「教えない方がおかしい」と言う連中も多いのにな…。

評価

0

皆さん、回答ありがとうございます。
JTableのロールオーバーですが、何とか動作するようにコードが記述できました。
しかし当方のNimbusルックアンドフィールではヘッダー部分が機能しませんが、その他のルックアンドフィールでは問題なく機能することがわかりました。
幾度と無く質問を繰り返し、また回答をいただきまして本当にありがとうございました。

評価

0

$よ
基礎が出来ていない と書くのではなく
〜を勉強しろ
〜を調べろ
〜は理解できるか
と書かないと駄目じゃないかね?

「人間の基礎」か「教える基礎」が君にないよ。

評価

0

それは、教える責任がある場合の話だな。
まず、こういう場所の回答者にはなんら責任がないことを理解する必要がある。
あえて嘘の情報、問題を引き起こす情報を与えるのはさすがにまずいと思うが。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。