質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

3289閲覧

Javaでフレームを画像と同じ形にして、その上JTextFieldを表示させたいのですが...

Choco_late

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2016/12/17 16:01

編集2016/12/19 11:09

Javaでデスクトップ用の短文メモを作りたいと思っているのですが、ある画像の上に、JTextFieldを置きたいと思っているのですが、なかなか上手く行きません。(自分は、画像がそのままフレームになっている場所に、JPanelでJTextFieldを置こうとしてたのですが、うまくいかず)

なので、それが実現できるようなコードを教えてほしいです。(参考にしたいと思います)

よろしくお願いします

Java

1MakeWindow.java 2 public void actionPerformed(ActionEvent e){ 3 // 選択されたときの処理を定義 4 TextBox t = new TextBox(); 5 t.makeImageWindow("aaa.png"); 6 7 8 } 9//上のように呼び出して、 10TextBox.Java 11 12import java.awt.Color; 13import java.awt.Container; 14import java.awt.Graphics; 15import java.awt.Image; 16import java.awt.event.MouseEvent; 17import java.awt.event.MouseListener; 18 19import javax.swing.ImageIcon; 20import javax.swing.JFrame; 21import javax.swing.JPanel; 22import javax.swing.JTextField; 23 24public class TextBox extends JPanel implements MouseListener{ 25 26 // マウスリスナのメソッドを定義 27 public void mouseClicked(MouseEvent e){ 28 29 } 30 public void mousePressed(MouseEvent e){ 31 32 } 33 public void mouseReleased(MouseEvent e){ 34 35 } 36 public void mouseEntered(MouseEvent e){ 37 38 } 39 public void mouseExited(MouseEvent e){ 40 41 } 42 43Canvas canvas = null; 44Container contentPane = null; 45 46 47@SuppressWarnings("deprecation") 48public JFrame makeImageWindow(String imagePath){ 49 JFrame frame1 = new JFrame("テスト"); 50 TextBox panel1 = new TextBox(); 51 JTextField text1 = new JTextField(5); 52 53 54 frame1.getContentPane().add(panel1); 55 frame1.setLocation(480,185); 56 frame1.setSize(200,200); 57 58 59 //panel1.setBackground(new Color(0,0,0,0)); 60 panel1.setOpaque(false);//パネルを透明に 61 panel1.show(); 62 panel1.add(text1); 63 64 65 text1.setOpaque(false);//テキストフィールドを透明に 66 67 68 frame1 = viewImage(frame1,imagePath); 69 return frame1; 70 } 71 72@SuppressWarnings("deprecation") 73public JFrame viewImage(JFrame frame,String imagePath){ 74 75 ImageIcon icon = new ImageIcon(imagePath); 76 77 frame.setUndecorated(true);//枠を撤去 78 frame.setBackground(new Color(0,0,0,0));//背景を透明に 79 80 frame.show(); 81 82 Image image = icon.getImage(); 83 84 contentPane = frame.getContentPane(); 85 if(canvas == null){ 86 canvas = new Canvas(image); 87 contentPane.add(canvas); 88 frame.setVisible(true); 89 } 90 else{ 91 canvas.image = image; 92 canvas.repaint(); 93 } 94 return frame; 95 } 96 97private class Canvas extends JPanel{ 98 private static final long serialVersionUID = 1L; 99 private Image image = null; 100 public Canvas(Image image){ 101 super(); 102 this.image = image; 103 } 104 public void paintComponent(Graphics g){ 105 if(image == null) return; 106 g.drawImage(image,0,0,this); 107 } 108 } 109} 110

追記:今は、JTextFieldを中心に配置し、普通にJTextFieldに文字が入力できるようにしたいです。問題点は、JTextFieldを中心に配置できない事と、ひらがなを入力するとパネル?(フレーム?)が白くなってしまう事に困っています。わかりづらくてすみません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2016/12/18 12:59 編集

どのようなコンポーネント階層にしていてどううまくいかないか等を記載するとよいと思います。それがないと丸投げ質問になってしまうと思います。余分なコードを除いた肝だけのコードを載せるのもよいかと。(あまり長いコードだと却って回答しづらくなります)(tetratailさんの指摘の綴りミスなおしました orz)
退会済みユーザー

退会済みユーザー

2016/12/17 23:39

しずらく× しづらく◎
naomi3

2016/12/18 01:31

上手く行っていなくても良いので、コードを教えてください。
KSwordOfHaste

2016/12/19 09:35

<code>ボタンを使って字下げしてください。投稿する前にプレビューで字下げが正しくできてるか確認できます。なお、コードは明示しておられますが「何がうまくいかないのか」が書かれてません。「期待が何で、それに反してどうなるのか」を書かないとダメですよね?
guest

回答1

0

ベストアンサー

中央に表示されるかどうかは座標設定の問題なのでsetLocationの指定を変えて試してみればよいと思います。

難しいのは背景を透明にしたJTextFieldの再描画の振る舞いの方だと思います。質問者さんのコードは不自然に感じる点が多く(不要なオブジェクトを生成していたりオブジェクト階層の生成順序がよくわからなかったり非推奨のメソッドを敢て使っていたり)自分には解析が難しそうだったのでなぜうまくいかないかの原因を指摘することはできませんでした。申し訳ないですがコードは実装しなおしました。
ポイントは以下のようなJPanelとJTextFieldの再描画メカニズムだと思います。おそらく質問者さんのコードのどこかにIMEモードでJTextField上にインライン入力した際の再描画がおかしくなる原因があるのだと思います。以下のような階層、不透明/透明、背景色とすると期待通りに動くようです。

JPanel(背景の画像を描画する) -> setOpaque(true); // backgroundは変えてない +- JTextField(背景は透明) -> setOpaque(false); setBackground(new Color(0,0,0,0));

コードは以下の通りです。普段はレイアウトはLayoutManagerにまかせて自分でsetSize/setLocationすることはないのですが今回はLayoutManagerを使わず明示的にサイズと位置を指定してしまってます。よって柔軟性のないコードになっている点に注意してください(例えばJTextFieldのフォントを変えたとき、固定サイズでレイアウトしているためおかしなことになります)

java

1@Override 2public void actionPerformed(ActionEvent e){ 3 new ImageFrame("aaa.png").setVisible(true); 4} 5... 6class ImageFrame extends JFrame { 7 BufferedImage image; 8 JPanel panel; 9 10 ImageFrame(String imagePath) { 11 setUndecorated(true); 12 13 try { 14 image = ImageIO.read(new File(imagePath)); 15 } catch (IOException e) { 16 e.printStackTrace(); 17 System.exit(2); 18 } 19 Dimension size = new Dimension(image.getWidth(), image.getHeight()); 20 21 panel = new JPanel(null) { 22 @Override 23 public void paintComponent(Graphics g) { 24 g.drawImage(image, 0, 0, this); 25 } 26 }; 27 panel.setSize(size); 28 29 JTextField txt = new JTextField(5); 30 txt.setBackground(new Color(0,0,0,0)); 31 txt.setOpaque(false); 32 panel.add(txt, BorderLayout.CENTER); 33 txt.setSize(50, 20); 34 txt.setLocation(50, 50); 35 36 setContentPane(panel); 37 setSize(size); 38 setLocation(200, 50); 39 } 40}

投稿2016/12/19 13:41

編集2016/12/19 13:43
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Choco_late

2016/12/20 13:42

画像の周りの余分な枠が残っていてそれをどうするか今考えてますが、とても参考になりました!ありがとうございました。
KSwordOfHaste

2016/12/20 13:47

JTextFieldなどの普通のコントロールは画面上でそのコントロールの存在が視認しやすいようにわざと枠などの飾りをつけていると思います。そうしたものがじゃまな場合は自分で直接テキストをGraphics#drawStringにより書いてやればいいのですが改行とかいろいろ面倒ですね。枠を消すといった特殊なことをしたい場合はそれなりに調査しないと難しいことも多いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問