前提・実現したいこと
上記課題に補足。現在チャットメッセージを開発しています.
まだまだ初期段階でいろいろ試行錯誤している状態です.GUIに関しては初心者です.
実現したいことは1つのメッセージ単位を後からどんどん追加していって,前のメッセージが上にたまっていくものを作りたいです.
JPanelに画像とボタン数種類を付加したものを一つのメッセージとしてパネル単位でメッセージ枠を作り、JScrollPaneクラスで実現しようと考えています.
今のところ,「JScrollPaneクラスは単独で用いるものではなく他のコンポーネントにスクロール機能を提供するもの」ということは分かりました.
発生している問題
現段階では送信ボタンを押すと,メッセージを出すようにしているのですが,その描画が反映されない状況です。
また,送信ボタン周りの操作クラスが再描画によってつぶれてしまい,適切な領域が割り当てられていなく,スクロールもない状態になってしまっています.
ChatBounddaryの継承をJPanelに変更したことで,add(scrollPane, BorderLayout.CENTER);を書く適切な位置がわからなくなってしまいました.
該当のソースコード
package boundary; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; public class Message extends JPanel implements MouseListener, ActionListener { private EmotionButton[] eb = new EmotionButton[4]; private ImageIcon[] icon = new ImageIcon[4]; //private static final int WIDTH = 900; //private static final int HEIGHT = 900; private JButton saveBtn; public Message(String imageName,FlowLayout layout) { setLayout(layout); setBackground(Color.WHITE); //setPreferredSize(new Dimension(WIDTH, HEIGHT)); //setBackground(Color.black); ImageIcon image = new ImageIcon(imageName); JLabel jl = new JLabel(image,JLabel.CENTER); add(jl); for (int i = 0; i < 4; i++) { icon[i] = new ImageIcon("emotion" + i + ".png"); eb[i] = new EmotionButton(icon[i]); eb[i].setPreferredSize(new Dimension(100, 100)); eb[i].addMouseListener(this); add(eb[i]); } saveBtn = new JButton("保存"); saveBtn.addActionListener(this); add(saveBtn, BorderLayout.EAST); } public void paintComponent(Graphics g) { super.paintComponent(g); } public void actionPerformed(ActionEvent e) { InformDialog.displayDialogText("保存します"); } public void mouseClicked(MouseEvent e) { EmotionButton eBtn = (EmotionButton) e.getSource(); switch (e.getButton()) { case MouseEvent.BUTTON1: eBtn.setText(String.valueOf(eBtn.editBtn("wataru"))); break; case MouseEvent.BUTTON3: ArrayList<String> arrUN = eBtn.getUserName(); for (int i = 0; i < arrUN.size(); i++) { System.out.println(arrUN.get(i)); } if (arrUN.size() != 0) { InformDialog.displayDialogText(arrUN.get(0)); } break; } } public void mouseEntered(MouseEvent e) { //InformDialog.displayDialogText("ボタンに触れましました。"); } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } }
package boundary; import javax.swing.JFrame; public class Main extends JFrame{ public static void main(String[] args) { Main frame = new Main(); frame.setTitle("画面遷移テスト"); frame.setSize(2200, 1400); frame.setLocationRelativeTo(null); ChatBoundary chatBoundary = new ChatBoundary(); frame.getContentPane().add(chatBoundary); frame.setVisible(true); } }
package boundary; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; public class ChatBoundary extends JPanel{ private static final FlowLayout right = new FlowLayout(FlowLayout.RIGHT); private static final FlowLayout left = new FlowLayout(FlowLayout.LEFT); public ChatBoundary(){ setLayout(new BorderLayout()); setPreferredSize(new Dimension(2200, 1200)); setBackground(Color.black); // メッセージが追加されていく本体 Box inner = Box.createVerticalBox(); inner.setBorder(BorderFactory.createLineBorder(Color.RED, 5)); //JPanel outer = new JPanel(new BorderLayout()); //outer.add(inner, BorderLayout.NORTH); //outer.setBorder(BorderFactory.createLineBorder(Color.GREEN, 5)); add(inner, BorderLayout.NORTH); setBorder(BorderFactory.createLineBorder(Color.GREEN, 5)); //JScrollPane scrollPane = new JScrollPane(outer); JScrollPane scrollPane = new JScrollPane(this); //add(scrollPane, BorderLayout.CENTER); scrollPane.setBorder(BorderFactory.createLineBorder(Color.BLUE, 5)); scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { private int max = scrollPane.getVerticalScrollBar().getMaximum(); public void adjustmentValueChanged(AdjustmentEvent e) { if (max - e.getAdjustable().getMaximum() == 0) return; e.getAdjustable().setValue(e.getAdjustable().getMaximum()); max = scrollPane.getVerticalScrollBar().getMaximum(); } }); JPanel controls = new JPanel(); // 操作エリア add(controls, BorderLayout.SOUTH); JTextField textField = new JTextField("メッセージ", 20); controls.add(textField); textField.selectAll(); // 全選択 JButton button = new JButton("送信"); controls.add(button); button.addActionListener(e -> { inner.add(new Message("naruto.jpg", right)); inner.add(Box.createVerticalStrut(10)); // 隙間 inner.add(new Message("naruto.jpg", left)); inner.add(Box.createVerticalStrut(10)); // 隙間 scrollPane.revalidate(); // 再描画 textField.selectAll(); // 全選択 textField.requestFocus(); // フォーカス }); textField.addActionListener(e -> button.doClick()); } }
package boundary; import java.util.ArrayList; import javax.swing.ImageIcon; import javax.swing.JButton; //メッセージのエモーションにかかわるボタンの処理クラス class EmotionButton extends JButton { private ArrayList<String> arrL = new ArrayList<String>(); public EmotionButton(ImageIcon icon) { super("0", icon); } public int editBtn(String userName) { if(arrL.contains(userName)) { arrL.remove(arrL.indexOf(userName)); return arrL.size(); } else { arrL.add(userName); return arrL.size(); } } public ArrayList<String> getUserName() { return arrL; } }
補足情報(FW/ツールのバージョンなど)
eclipse 2020/12/9にダウンロードしたため最新だと思います.
java8です.
基本swingを用いて開発します.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/16 04:22
2020/12/16 05:02
2020/12/16 06:35
2020/12/16 09:58