tanakahdaのプログラマ手帳

プログラミングとかソフトウェア開発とかの備忘録

JListのセルをカスタマイズする(GridBagLayout)@Java Swing

package com.tanakahda.apps.swing.jlist.customcell.a005;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;

public class JListSample extends JFrame{

    public static void main(String[] args){
        JListSample test = new JListSample("JListSample");
        /* 終了処理を変更 */
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        /*
        * x - このコンポーネントの新しい x 座標
        * y - このコンポーネントの新しい y 座標
        * width - このコンポーネントの新しい width
        * height - このコンポーネントの新しい height
        */
        test.setBounds(10, 10, 640, 480);
        test.setVisible(true);
    }

    JListSample(String title){
        setTitle(title);
        String[] initData = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
        JList<String> list = new JList<String>(initData);
        
        MyCellRenderer renderer = new MyCellRenderer();
        list.setCellRenderer(renderer);
        
        JScrollPane sp = new JScrollPane();
        sp.getViewport().setView(list);
        // スクロールのサイズ
        sp.setPreferredSize(new Dimension(640, 480));
        
        JPanel p = new JPanel();
        p.add(sp);
        getContentPane().add(p, BorderLayout.CENTER);
        
    }
    
    
    /**
    * GridBagLayoutの独自セルを返します.
    * @author tanakahda
    */
    class MyCellRenderer extends JPanel implements ListCellRenderer<Object> {
        
        private GridBagLayout gblayout;
        
        public MyCellRenderer() {
            gblayout = new GridBagLayout();
        }
        
        @Override
        public Component getListCellRendererComponent(
                JList<?> list, Object value, int index, boolean isSelected,
                boolean cellHasFocus) {
            JPanel p = new JPanel();
            p.setLayout(gblayout);
            JLabel l1 = new JLabel("label1", SwingConstants.CENTER);
            JLabel l2 = new JLabel("label2", SwingConstants.CENTER);
            JLabel l3 = new JLabel("label3", SwingConstants.CENTER);
            JLabel l4 = new JLabel("label4", SwingConstants.CENTER);
            
            l1.setBorder(new LineBorder(Color.BLACK, 2));
            l2.setBorder(new LineBorder(Color.BLACK, 2));
            l3.setBorder(new LineBorder(Color.BLACK, 2));
            l4.setBorder(new LineBorder(Color.BLACK, 2));
            
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 1;
            gbc.gridheight = 2;
            gbc.insets = new Insets(1, 1, 1, 1);
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gblayout.setConstraints(l1, gbc);
            p.add(l1);
            
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.gridwidth = 1;
            gbc.gridheight = 1;
            gbc.insets = new Insets(1, 1, 1, 1);
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gblayout.setConstraints(l2, gbc);
            p.add(l2);
            
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 1;
            gbc.gridy = 1;
            gbc.gridwidth = 1;
            gbc.gridheight = 1;
            gbc.insets = new Insets(1, 1, 1, 1);
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gblayout.setConstraints(l3, gbc);
            p.add(l3);
            
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 0;
            gbc.gridy = 2;
            gbc.gridwidth = 2;
            gbc.gridheight = 1;
            gbc.insets = new Insets(1, 1, 1, 1);
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gblayout.setConstraints(l4, gbc);
            p.add(l4);
            
            if (isSelected) {
                p.setBackground(Color.gray);
                p.setForeground(Color.white);
            } else {
                p.setBackground(Color.white);
                p.setForeground(Color.black);
            }
            
            return p;
        } 
    }
}

JListの元データに、追加で文字を付与したJLabelをカスタムセルにしてみる@Java Swing

/** リストの元データ */
private String[] data = {"Tanaka", "Tomita", "Ito"};

f:id:tanakahda:20220326231217p:plain

package com.tanakahda.apps.swing.jlist.customcell.simple_customcell;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;

public class JListSample extends JFrame {
    
    /** リストの元データ */
    private String[] data = {"Tanaka", "Tomita", "Ito"};
    
    public static void main(String[] args) {
        JListSample frame = new JListSample();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(10, 10, 250, 130);
        frame.setVisible(true);
    }

    public JListSample() {
        JList<String> list = new JList<String>(data);
        list.setCellRenderer(new SimpleCellRenderer());
        getContentPane().add(list, BorderLayout.CENTER);
    }
    
    /**
    * カスタムセル
    */
    class SimpleCellRenderer implements ListCellRenderer<String> {
        
        JLabel label;
        
        public SimpleCellRenderer() {
            label = new JLabel();
            label.setOpaque(true);
        }
        
        @Override
        public Component getListCellRendererComponent(
                JList<? extends String> list, String value, int index,
                boolean isSelected, boolean cellHasFocus) {

            label.setText("Hello, Dear " + value + ".");
            
            // カスタムセルにすると選択状態がわからなくなるので色をつける
            if (isSelected) {
                label.setBackground(Color.BLUE);
                label.setForeground(Color.WHITE);
            } else {
                label.setBackground(Color.WHITE);
                label.setForeground(Color.BLACK);
            }
            
            return label;
        }
    }
}

JListのデータセットに独自クラスを設定する@Java Swing

package com.tanakahda.apps.swing.jlist;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

public class JListExample extends JPanel {

    private JList list;
    
    JListExample() {
        setLayout(new BorderLayout());
        
        User user1 = new User();
        user1.setName("tanaka");
        User user2 = new User();
        user2.setName("sato");
        
        list = new JList(new User[] {user1, user2});
        add(list, BorderLayout.CENTER);
    }
    
    public static void main(String[] args) {
        JListExample e = new JListExample();
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(e);
        frame.pack();
        frame.setVisible(true);
        e.getElementValues();
    }
    
    private void getElementValues() {
        
        final int ELEMENT_SIZE = list.getModel().getSize();       
        User user = null;
        for (int i = 0; i < ELEMENT_SIZE; i++) {
            user = (User)list.getModel().getElementAt(i);
            System.out.println(user.getName());
        }
    }
    
    class User {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
        
    }
}

結果

tanaka
sato

テキストのドラッグアンドドロップ@Java Swing

f:id:tanakahda:20220226083327p:plain

package com.tanakahda.apps.swing.draganddrop;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class DnDBetweenJTextAreaAndJTextFieldDemo {
  public static void main(String[] args) {
    JFrame frame = new JFrame("Drag and Drop Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(new JPanel());
    JTextField textField = new JTextField(25);
    textField.setText("www.java2s.com");
    frame.add(textField);

    JTextArea textArea = new JTextArea(4, 25);
    textArea.setText("Demonstrating\ndrag and drop");
    frame.getContentPane().add(new JScrollPane(textArea));
    textArea.setDragEnabled(true);
    textField.setDragEnabled(true);
    frame.pack();
    frame.setVisible(true);

  }
}

引用: www.java2s.com

import, from, as について@Python

bar.py

def foo():
    pass
# importとは、別のファイル(モジュール)に記述されたPythonコードを読み込む
import bar
bar.foo()
# モジュールの全体を利用するのが、importで、モジュールの一部の変数や関数を利用するのが、from
from bar import foo
foo()

# 結果 <function bar.foo()>
# import したメソッドに別名(エイリアス)をつけて実行する
from bar import foo as f
f

# 結果 <function bar.foo()>

GETの値を取得する@SpringBoot2

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {
    
    @GetMapping("/greeting")
    public String greeting(@RequestParam("message") 
             String message, Model model) {
        
        // 取得した値をViewに渡すためにModelへ追加する。
        model.addAttribute("greeting", message);
        return "hello";
    }
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
</head>
<body>
    <p th:text="${greeting}"></p>
</body>
</html>

f:id:tanakahda:20220220231516p:plain