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

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

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

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

Q&A

解決済

2回答

10072閲覧

JTableの文字のフォントやサイズを変更したい

DaiAoki

総合スコア67

Java

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

0グッド

0クリップ

投稿2015/09/03 11:36

いつもありがとうございます。
現在、JavaでGUIのメモ帳作りをしています。
ユーザーが指定(ドラッグ)した範囲の文字を変更できるようにしたいです。
入力された文字のフォントやサイズ、色などを変更するツールバーのようなもの(Wordのツールバーの簡易的なイメージです)を設置したいと考えているのですがなかなかうまくいきません。

というのも、おそらく私が作ろうとしているメモ帳は少し特殊で、テキスト入力を受ける付けるコンポーネントがJTextPaneクラスではなくJTableクラスのインスタンスだからだと思いました。
*メモ帳の仕様上、複数行・列にしたいため、JTextPaneではなく、JTableを使っています。

自力で調べた結果、JTextPaneの場合は親子関係にあるためJTextComponentのメソッドを使えばできることがわかったのですが、
JTableクラスからだと、JTextComponentのメソッドを呼び出せず・・・というところで立ち止まってしまいました。

JTableの文字のフォントやサイズを変更できるようにするにはどのようにすれば良いでしょうか?
JTextComponentに用意されているようなツールバーを作れるようなクラスはあるのでしょうか?

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

やりたい事を伺っていると、JTableを使うよりもJEditorPaneを使ってHTMLでコンテンツを作る形の方がよさそうに思います。Java Swing Tips - てんぷらメモにサンプルコードがたくさんあるので、そちらを参考にされるとよいのではないでしょうか?

※JTableのフォント変更についても解説が色々あります。

参考: JEditorPaneのHTMLEditorKitにCSSを適用

投稿2015/09/03 14:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

DaiAoki

2015/09/03 15:04

ご回答ありがとうございます。 リンクに目を通してみましたが、よくわかりませんでした。プログラミング自体初心者でして、HTMLなどの他の言語は全くわかりません。まずはJavaをきっちりやろうと思っていたのですが、他の言語の勉強も並行してやらなければ今回のようにできることが限られてくるのでしょうか。
退会済みユーザー

退会済みユーザー

2015/09/03 15:24

失礼しました。HTMLは今お使いのブラウザの表示に使われる言語なので、HTMLから学びはじめる方も非常に多い言語です。なので、もしかするとご存知かと思い、提示させていただきました。 Javaはプログラミング言語ですが、今回のようにコンテンツを装飾する情報を表現するのに適した言語ではありません。コンピュータを扱う時に使用する言語にも適材適所があります。とはいえ、最初から全てをうまく進める必要もないので、JTableで文字の装飾を実現されるのが良いと思います。
DaiAoki

2015/09/07 12:12

ご回答ありがとうございます。 そもそもJavaのプログラミングにHTMLを使えるということ自体知らなかったので、とても勉強になりました。 JToggleButtonのボルドーの「B」を一部だけHTMLで太文字にしてみました。
guest

0

ベストアンサー

JTable.setFontメソッドで変更できます。
ただし、セルの高さは自動で変わってくれないので合わせて変更する必要があります。


(追記)

セルに属性を持たせるのではなく、独自のCellRendererを作ってそこで制御するようにします。
下記の例では、特定のセルだけ、2行目の左から2列目だけ(つまり"d"だけ)フォントを変えています。

ご質問のようなことをするには、MyCellRendererクラスに2次元配列を用意して、そこにフォントなどの情報を持たせるようにすればできると思います。

lang

1import java.awt.Component; 2import java.awt.Font; 3import javax.swing.JFrame; 4import javax.swing.JLabel; 5import javax.swing.JTable; 6import javax.swing.table.DefaultTableCellRenderer; 7 8public final class App extends JFrame { 9 10 private JTable table; 11 12 public App() { 13 setTitle("App"); 14 setDefaultCloseOperation(EXIT_ON_CLOSE); 15 table = new JTable(new Object[][] { 16 new Object[] { "a", "b" }, new Object[] { "c", "d" } }, 17 new Object[] { "col1", "col2" }); 18 table.setDefaultRenderer(Object.class, new MyCellRenderer()); 19 add(table); 20 } 21 22 static class MyCellRenderer extends DefaultTableCellRenderer { 23 24 @Override 25 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 26 boolean hasFocus, int row, int column) { 27 if (row == 1 && column == 1) { 28 JLabel label = new JLabel(String.valueOf(value)); 29 label.setFont(new Font("monospace", Font.BOLD, 16)); 30 // 良くないやりかた:追記2を参照 31 return label; 32 } 33 return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 34 } 35 36 } 37 38 public static void main(String[] args) { 39 javax.swing.SwingUtilities.invokeLater(new Runnable() { 40 public void run() { 41 App app = new App(); 42 app.setSize(600, 200); 43 app.setLocationRelativeTo(null); 44 app.setVisible(true); 45 } 46 }); 47 } 48 49}

(追記2)

JLabelをそのまま返すと選択状態が描画できなくなってしまうので、ダメでした。すみません。
super.getTableCellRendererComponentのコンポーネントに直接フォント変更で行けるはずです。
選択したセルをBOLDにするMyCellRendererを書いてみましたので、参考にしてください。

static class MyCellRenderer extends DefaultTableCellRenderer { JTable table; Map<Point, Font> cellRendererMap; public MyCellRenderer(JTable table) { this.table = table; this.cellRendererMap =new HashMap<>(); } void applyBoldToSelectedCells() { Font baseFont = table.getFont(); int[] cols = table.getSelectedColumns(); int[] rows = table.getSelectedRows(); for (int row : rows) { for (int col : cols) { Point k = new Point(col, row); Font v = baseFont.deriveFont(Font.BOLD); cellRendererMap.put(k, v); } } table.updateUI(); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); Point key = new Point(column, row); if (cellRendererMap.containsKey(key)) { Font font = cellRendererMap.get(key); c.setFont(font); } return c; } }

投稿2015/09/03 12:43

編集2015/09/10 22:41
argius

総合スコア9388

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

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

DaiAoki

2015/09/03 15:00

ご回答ありがとうございます。 現時点で御指摘のありましたJTable.setFontメソッドを使ったやり方として思いつく手順は・・・ 1.JToolBarでツールバーを作成 2.JComboBoxなどを使い、各種設定ボタンを作り、ツールバーに貼り付ける 3.選択(ドラッグ)された範囲に対する処理を、各種ボタンのアクションリスナーで実装する 3番で、選択された範囲をアクションリスナーに渡す方法がわかりません。getSelectionStartのようなメソッドがあればいいのですが・・・
argius

2015/09/03 15:18

私が見当違いのことを言っているような気がしてきましたが、JTableの選択範囲ならgetSelectedColumns()とgetSelectedRows()で取得できます。JTableは列行どちらかだけとびとびで選択が可能なので配列で取得になります。
DaiAoki

2015/09/07 12:06

ご回答ありがとうございます。 ツールバーにボタンやコンボボックスの貼り付けはできたのですが、選択範囲を取得して、その範囲に対して何らかの処理をすることができません。 例えば、ボルドー(太文字)にするボタンを実装するとして、 JToggleButton boldButton=new JToggleButton("<html><b>B</b></html>"); boldButton.setPreferredSize(new Dimension(26, 26)); boldButton.addActionListener(new BoldListener( )); toolBar.add(boldButton); リスナーが、 public class BoldListener implements ActionListener{ public void actionPerformed(ActionEvent a){ //ここの記述方法がわかりません。 } } ユーザーが選択した範囲を int[ ] columns=getSelectedColumns( ) int[ ] rows=getSelectedRows( ) で取得し、 その範囲に対してsetBold(引数として範囲)のようなメソッドで処理できれば良いと思ってAPIを調べていたのですが、見つかりませんでした。
argius

2015/09/07 12:54

setBoldのような直感的なAPIはありません。 詳しくは、追記しましたのでそちらをご覧ください。
DaiAoki

2015/09/07 16:16

ご回答ありがとうございます。 kompiroさんもおっしゃっていたように、言語ごとに向き不向きがあるのですね。 最初にどの言語から学び始めようか悩んでいた時に、そのようなことを聞いたことがありましたが、今初めて実感しています。これも良い経験になりました。 Rendererについて勉強して、また作り直してみます。 勉強する良い機会だと思って、JTableクラスから逃げずに戦いたいと思います。 また少し時間が空くと思いますが、コードを書いたらまたここに返答したいと思います。 長い間お付き合いいただき本当にありがとうございます。 よろしくお願いします。
argius

2015/09/07 16:27

わかりました。時間についてはお気遣いなく。
DaiAoki

2015/09/08 08:20

途中経過です。 レンダラーについて勉強してきました。 調べている中で、便利そうなレンダラークラスがあったので、試しにコピペして実際に自分のコードに組み込んでみたところ正常に機能しました。ちなみにそのレンダラークラスはセルの行の色を水色と白の交互にするというものです。 私がやりたいこととは違ってきますが、レンダラーをセットするというイメージはわきました。 これから、ツールバーのそれぞれのボタンのリスナーを実装していきたいと思います。 具体的な手順としては、 ①BOLDボタンがクリックされる ②リスナーがそれを受け取って、actionPerformedメソッドを実行する actionPerformedメソッドの処理について迷っているのですが、 ③選択されたセルの範囲をレンダラーごと変更するメソッド →このメソッドの場合、setFontを使えば良いと思うのですが、選択された範囲はgetValueAtで受け取って、それを配列か何かに格納すれば良いのでしょうか? 具体的には、 table.getValueAt(int vr,int vc); int[][] a=new int[vr][vc]; a.setFont(new Font(書式をgetするメソッド , Font.BOLD , サイズをgetするメソッド)); return a; または、 ③getTableCellRendererComponentメソッド内で何らかの処理をする →正直、ここらへんの理解はまだ不十分です。 そもそもこの方法で実装可能かわかりませんし、可能だとして洗濯されたセルの範囲を受け取る方法が正しいのか自信がありません。 何か助言をいただければ幸いです。
argius

2015/09/08 08:50

BOLDボタンが押されたときにする処理、つまり②では、「MyCellRendererにどのセルがBOLDなのかを通知する」処理を行います。その通知した情報を、MyCellRenderer内に保存しておきます。情報は、例えばBOLDだけで良ければ、booleanの二次元配列などにして、BOLDにしたセルだけtrueにします。 Rendererクラスは再描画のたびに実行されるので、その都度保存しておいたフォント情報を元にフォントを変更したセルだけ個別のBOLDにしたコンポーネントを表示するようにします。 その便利そうなレンダラークラスと、私の書いた例の共通点を見つけることができれば理解が進むと思います。
DaiAoki

2015/09/08 15:50

ご回答ありがとうございます。 argiusさんがあげてくださった例のコードを書きながら考えてきましたが、いまいちピーンときません。 例にあげてくださったコードの意味は大体把握できるのですが、一点確認しておきたいことがあります。 MyCellRendererクラスのメソッドの最後の return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); で戻しているのは、a,b,cでしょうか? つまり、if内で戻しているのはラベルとして加工されたdで、 if外で戻しているのはそれ以外ということなのでしょうか? それとも、dを含めてa,b,c,d全てを戻しているのでしょうか? おそらく、getTableCellRendererComponentメソッドの使い方をよく理解しきれていないのだと思います・・・。
argius

2015/09/08 16:15

そうですね、ここは非常に分かりにくいのですが、return super.get...で戻しているのはa,b,c自体ではなく、MyCellRenderer自体です。戻り値の型がComponentになっているので、Componentなら何でも良いのです。値がaの時にはComponentとしてMyCellRendererが使われ、value="a"がセットされた状態で返されます。b,cも同様です。 まとめると以下のようになります。 a,b,cの時:Component=MyCellRenderer、value=a,b,cのいずれかをセットしたものが戻る dの時:Component=JLabel、value=dをセットしてフォントを変更したものが戻る
DaiAoki

2015/09/08 16:32

ご回答ありがとうございます。 おそらく理解できたと思いますが、さらに一つ疑問が出てきました。 dの場合はlabelとして戻されて、a,b,cの場合は何も処理がされていないのでComponentとして戻されているのでしょうか? labelもComponentの一つであるということはもちろん承知しているのですが、この場合、a,b,cはlabelではないですよね? 伝わりにくかったら申し訳ございません。
argius

2015/09/08 16:47

「何も処理がされていないので」ではなくて、「デフォルトで良いので」、MyCellRendererを返しています。 MyCellRendererのインスタンスは1つ(自分自身)しか無いので、それにフォントを設定してしまうと、すべてのフォントの設定が変わってしまいます。 dの時は、dを表示する専用のコンポーネントとしてJLabelをnewしてフォントを変更しています。そのため、dのときだけ異なるフォント設定で表示されます。 「labelではない」のは、Componentと互換があるクラスのインスタンスならJLabelである必要は無く何でも良いので、デフォルトのときは無駄にインスタンスを生成しないMyCellRendererを返すほうが効率的だからです。a,b,cの場合もJLabelをnewして戻しても動作しますが無駄が多くなります。
DaiAoki

2015/09/08 17:28

ご回答ありがとうございます。 なるほど、とてもわかりやすくてかなり理解が深まりました。 例えば、一行おきに行の背景色を変える処理をレンダラーに持たせる場合(水色、白、水色、白・・・)は、コンポーネントに持たせるのではなく、レンダラーに持たせる・・・なぜなら、新たに行を追加した時や行を削除した時にも交互の色になるようにするため・・・ 逆に、コンポーネントごとにフォントを設定したい場合は、受け取った状態のコンポーネントのままだとフォントを設定できないので、一度JLabelにするなどしてフォントを変更するということですね。 フォントを設定しないものに関しては、そのままでもComponentとしての扱いとなるため、特段JLabelにする理由が見当たらないということですね。 だいぶイメージがつかめてきました。今の時点で、こちらが JTable内に用意したComponentを事前に変更する方法はわかりました。 しかし、選択された範囲を受け取るということがいまいち理解できません。 つまり、上の例だと「if (row == 1 && column == 1)」でこちらから指定していますが、マウスでクリックするなどして洗濯されたセルの情報(rowとcolumn)を受け取るということはできるのでしょうか? >>「MyCellRendererにどのセルがBOLDなのかを通知する」処理を行います。その通知した情報を、MyCellRenderer内に保存しておきます。 また、MyCellRenderer内に保存しておくというのは、例えばJLabelの状態で持っておくということでしょうか?
argius

2015/09/09 04:18

> 洗濯されたセルの情報(rowとcolumn)を受け取るということはできるのでしょうか? これは、前に書いたgetSelectedRowsとgetSelectedColumnsの組み合わせで取得します。(セルを選択した状態でBOLDボタンを押すという前提であれば) > MyCellRenderer内に保存しておくというのは JLabelで保存しておくやり方が上手くいくか分からないので、上手くいかなければ自作クラスなどで情報を持っておけば良いでしょう。
DaiAoki

2015/09/10 16:29 編集

ご回答ありがとうございます。 argiusさんの助言を参考に自分なりにコードを書いてみました。ツールバーのボルドーボタンを押すと選択した範囲がボルドーに変わるという機能です。 コンパイルエラーは発生せず、いちおう起動はするのですが、思った通りに動きません。 下記にそれに関連するコードを抜粋しました。 public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus,int row, int column) { if(isSelected=true && selectedButton=="ボルドー"){ JLabel label=new JLabel(String.valueOf(value)); label.setFont(new Font("monospace",Font.BOLD,12)); return label; } return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } また、ボルドーボタンのアクションリスナーとしては・・・ public class BoldListener implements ActionListener{ public void actionPerformed(ActionEvent a){ selectedButton=("ボルドー") ; } } コードの冒頭で String selectedButton; と宣言しています。 意図としては、 セルが選択されている状態でボルドーボタンが押されたら、 BoldListenerがselectedButtonに"ボルドー"を代入し、getTableCellRendererComponentメソッド内のif関数の条件式を満たすため、選択された範囲のフォントが変わるというようなことを考えました。 ですが、実際に試してみたところ、ボルドーには変わるものの、すべてボルドーに変わり、何も入力されていないセルにはボルドーでnullと表示されてしまいます。 下線ボタンやサイズ変更ボタンが押された場合には、selectedButtonに"下線"、"サイズ"と代入しようと考えました。 自分でコードを書きながら、何となくこのコードではうまくいかない感覚があったのですが、実際になぜうまくいかないのか検討がつきません。 コンパイルに成功した時は少し嬉しかったのですが・・・ ご教授のほどよろしくお願いします。
argius

2015/09/10 16:29

BOLDボタンを押すタイミングと、描画するタイミングは一致しないので、あくまでアクションは状態を変える処理にしなければなりません。 もう少し具体的な実装例を書いてみます。ただし効率が良いかどうかは分かりません。 MyCellRendererに、Map<Point, JLabel> boldCellMapというフィールドを持たせます。 BOLDボタンが押されたら、そのセルの座標( new Point(列, 行) )をキーにして、new JLabelしてフォントを変更したものを値としてMapに保存します。 getTableCellRendererComponentでは、 Point p = new Point(column, row); if (boldCellMap.containsKey(p)) { return boldCellMap.get(p); } return ...; とします。
DaiAoki

2015/09/10 16:30

申し訳ございません。 投稿したコードにミスがありましたので、編集し、修正しました。
DaiAoki

2015/09/10 16:43

ご回答ありがとうございます。 Mapという存在は聞いたことがあったのですが、よく理解していないので勉強したら出直します。お時間をおかけして申し訳ございません。 ツールバーを実装するうえで、Mapの他にも勉強しておいた良いことはありますでしょうか。
argius

2015/09/10 22:42

MapとかListなどのコレクションについては、Javaでも良く使う機能のひとつですので、今回の実装に関係なく覚えておくと便利ですよ。 それと、コメントで書いた内容に不備がありました。申し訳ありません。 追記2を回答欄に追加しましたので、参考にしてください。
DaiAoki

2015/09/11 09:51

ご回答ありがとうございます。 今、手元にあるスッキリわかるJAVA入門(実践編)を見てみたら、MapやListについて書かれていたので、一度書籍の方で勉強して、コードを書いたうえでまた書き込みます。 いつも詳細なご説明をしていただき、とても勉強になります。 もう一段階レベルアップするにはどうしたら良いか悩んで、とにかく何かモノを作ろうと考えていたのですが、現状、自分に足りないのは基本的なAPIの知識だと気づけました。 私も早く回答者側に回れるようがんばります。
argius

2015/09/11 10:00

そうですね、基本的なAPIを理解するのはレベルアップに欠かせないと思います。 頑張ってください。
DaiAoki

2015/09/11 14:38

先ほど、argiusさんが挙げてくださったコードに出てくるクラスの勉強をし、実際に動かしてみたところ無事に動きました。 最終的には、表現が正しいかわかりませんが、JTableとMyCellRenderを全クラス共通の変数として宣言し、ボルドーリスナーにrenderer.applyBoldToSelectedCells( )メソッドを付け加えました。 カラーやサイズ、フォントについても同様に実装したいと思います。 一点質問があるのですが、ウィンドウ上でボルドーボタンを押した時にボタンが押ささった状態のままになってしまいます。 つまり、フォントを変えたいセルを選択してボタンを押した時に、 (理想) ①セルを選択 ②ボタンを押す→太文字に変わる ③他の(ボルドーでない)セルを選択する ④ボタンは何もしなくてもOFF状態になる というようにしたいところ、 (現実) ①〜③ 同様 ④ボタンはONの状態のまま というようになってしまいます。 ですので、他のセルを選択して、ONの状態になっていたボタンを押してOFFの状態にすると太文字になってしまうという状況です。(伝わりにくくてすみません) セルを選択した時に、 そのセルがボルドーならボタンがON、そうでないならOFFになる、 ONの状態で入力するとボルドーになり、OFFの状態で入力するとボルドーでなくなる、 というような機能を付け加えたいと考えています。 この場合、おそらくリスナーの方ではなくMyCellRendererで範囲を選択したことを受け取った時に何らかの処理をすると思うのですが、どのような処理をすれば良いのでしょうか?
DaiAoki

2015/09/12 15:51

ご回答ありがとうございます。 ボルドーボタンがついに完成しました。 続いて、下線ボタンと赤色ボタン(ボタンを押したら文字の色が赤に変わる)を実装しようとして、ボルドーボタンのコードを参考にして書いていたところ、一箇所つまづいてしまいました。 ボルドーボタンの場合はFontクラスを使えば実装できたと思うのですが、下線ボタンや赤色ボタンはFontクラスで用意されているメソッドでは解決できないことがわかりました。 そこで、まずは赤色ボタンをColorクラスを用いて作ろうと思ったのですが、ボルドーボタンでいうderiveFontメソッドのようなものがなく、先に進めなくなってしまいました。 赤色ボタンを実装するためにはボルドーボタンの時とはまた違ったアルゴリズムで作らなければ不可能でしょうか?
argius

2015/09/12 22:26

button.setBackground(Color.RED);でできると思います。
DaiAoki

2015/09/13 09:01

ご回答ありがとうございます。 赤色ボタンを押した時のアクションリスナーとして以下のようなコードを書いたのですが、うまくいきません。 public void applyRedButtonToSelectedCells( ){ int[ ] cols=table.getSelectedColumns( ); int[ ] rows=table.getSelectedRows( ); for(int row : rows){ for(int col : cols){ Point k=new Point(col,row);               //ここに何を書いてよいかわかりません。 cellRendererMap.put(k,v); } } table.updateUI( ); } おそらく、ボルドーの時の違って、 Font baseFont=table.getFont( ); でフォント情報は受け取る必要はないと思うのですが、カラーの場合はフォント情報の代わりにカラー情報を受け取るといったことが必要なのでしょうか?
argius

2015/09/13 09:07

考え方はapplyBoldToSelectedCellsのときとまったく同じです。どのような属性を持たせたいのか分からないので前回はFontだけにしましたが、今後も拡張したいのであれば、書式クラス(例:CellStyleクラス)を作ってそれをMap(Map<Point, CellStyle> cellStyleMap)に持たせると良いでしょう。 書式クラスのやり方が難しいようでしたら、Map<Point, Color> cellBGColorMapを新しく作って、applyBoldToSelectedCellsと同じように処理してください。
DaiAoki

2015/09/13 16:33

ご回答ありがとうございます。 ボルドーの時と同じやり方で書いてみました。 以下に赤色ボタンに関連するコードを書きます。 static class MyCellRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; Color evenColor = new Color(240, 240, 255); JTable table; Map<Point,Color> cellBGColorMap; public MyCellRenderer(JTable table){ this.table=table; this.cellRendererMap=new HashMap<>( ); } public void applyRedButtonToSelectedCells( ){ Color baseColor=table.getBackground( ); int[ ] cols=table.getSelectedColumns( ); int[ ] rows=table.getSelectedRows( ); for(int row : rows){ for(int col : cols){ Point k=new Point(col,row); Color v=baseColor.setBackground(Color.RED); cellBGColorMap.put(k,v); } } table.updateUI( ); } @Override public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus,int row, int column) { Component c=super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); Point key=new Point(column,row); if(cellBGColorMap.containsKey(key)){ Color color=cellBGColorMap.get(key); c.setBackground(Color.RED); } return this; } } コンパイルしたところ、 applyRedButtonToSelectedCellsメソッドの、setBackgroundでエラーになりました。 エラーメッセージによると、カラークラスで定義されていないというように出てきました。 メソッドの使い方がおかしいのでしょうか?(Color v=baseColor.の部分が怪しいと思っています。)
argius

2015/09/13 16:58

Color v=baseColor.setBackground(Color.RED); この行(と前後の処理も含めて)が何をしているのか、もう一度よく考えてみてください。そうすれば、どう直すのかはすぐに分かるはずです。 言い方を変えると、なぜbaseColorにsetBackgroundをしようとしているのでしょうか。 (ヒント:直訳すると、baseColorにREDをsetBackgroundし、結果をColor vに代入、という処理になっています。) ここまで来てこんなこと言うのは何ですが、これをSwingで実装するのは難易度が高めなので大変だと思います。ですが、DaiAoki30さん自身が作るものですので、がんばって理解してみてください。
argius

2015/09/13 17:16

補足です。 Fontには、サイズとフォント種類とフォントスタイルの3つの情報を持っているので、フォントスタイル(Plain/Bold/Italic)だけを変えるには、deriveFontを使う必要がありました。 Colorの場合はBackgroundに適用する色をブレンドする必要は無いと思うので、deriveFontに似たような処理は不要です。
DaiAoki

2015/09/14 05:56 編集

ご回答ありがとうございます。 コードの意味を探りながら書き直してみたところうまく機能させることができました。 public void applyRedButtonToSelectedCells( ){ int[ ] cols=table.getSelectedColumns( ); int[ ] rows=table.getSelectedRows( ); for(int row : rows){ for(int col : cols){ Point k=new Point(col,row); Color v=Color.RED; cellBGColorMap.put(k,v); } } table.updateUI( ); } 選択された範囲をPointのkとして、それをcellBGColorMapに渡しました。こうすることで、オーバーライドしたgetTableCellRendererComponentメソッドの if(cellBGColorMap.containsKey(key)){ Color color=cellBGColorMap.get(key); c.setForeground(Color.RED); } が実行されるようになりました。 悩んでいた箇所を最終的にはColor v=Color.RED;というように書いてみて機能するようになったのですが、正直なところ、なぜこうすることが必要なのかしっくりきません。 mapに、キーとなるkと関連づけたv(ここでは赤色)を渡しているわけですが、そもそもなぜvを渡す必要があるのでしょうか? if(cellBGColorMap.containsKey(key)){  処理 }が実行されるためにはMapにキーとなるkだけ含まれていれば良いのではないでしょうか? というのも、どのみちif文が呼ばれたらc.setForeground(Color.RED);というように、コンポーネントに対して処理を行うメソッドが含まれているので、vを渡す理由がしっくりきません。 【追記】 試しにColor v=Color.RED;のREDをBLUEに書き直してみたところ、実行したらREDになりました。 色を決定付けるのはif内の処理だということはわかるのですが、そうなるとますますColor v=Color.RED;の意味がわかりません。いっそのこと、mapにkだけ渡せば機能するのではないかと思ってしまいます。
argius

2015/09/14 06:06

背景色が赤1色だけでないと思ったからです。 また、Mapはvがnullだとダメです。 kだけを使うやり方としてSetを使う手もありますが、DaiAoki30さんがコレクションについてあまり詳しくないとのことでしたので、まずはBoldに似たやり方で動かせる方法を提示しました。 個人的な理想を言えば、vをCellStyleクラスにしてBold,背景赤を持たせるようにするのがしっくりいくと思っています。そうすれば、後から機能を追加する時に、たとえば背景色を赤以外にもできるようにしたり、文字色も変えられるようにしやすくなるからです。 ただ、そこまで実装するのは現時点では困難と判断し、前述の方式で説明させていただきました。
DaiAoki

2015/09/14 06:16 編集

連投失礼します。 上の件ですが、自己解決しました。 念のため、解釈があっているか確認していただいてもよろしいでしょうか? c.setForeground(Color.RED);の( )内をcolorにしたところ、うまく機能しました。 そもそもColor color=cellBGColorMap.get(key);でcolorとして受け取っているのが、vで、それをさらに受け渡しているというイメージでよろしかったでしょうか? vをmapのColorに渡す→colorとしてmapから受け取る→c.setForeground(color)でcolorを受け取りcにセット→動作 【追記】 コメントが入れ違いになってしまい申し訳ありません。 たしかにこの方法ですと、後から背景色を増やそうとするとそのために同じようなメソッドを何個も作らなければいけなくなりますね。 CellStyleクラスの方法については現時点では少し厳しいと思うので、今回はこちらの方法を採用したいと思います。しかし、さらにレベルアップした時にはargiusさんが紹介してくださった方法も勉強していきたいと思います。
argius

2015/09/14 06:35

すみません、私もコメントを良く理解できていなかったようですね。 >Color color=cellBGColorMap.get(key);でcolorとして受け取っているのが、vで、... その通りです。 >さらにレベルアップした時には... 考え方は理解していただけたと思うので、もう少しJavaの理解が進んだら、ぜひチャレンジしてみてください。
DaiAoki

2015/09/14 07:13

ご親切にありがとうございます。 おかげさまで、それぞれのコードがどのようにつながっているのかが見えてきました。 これを応用すればサイズとフォント(明朝体など)のボタンの実装も何となくできそうです。一覧からクリックされたものが何なのかの受け渡しをうまく行えれば何とかなりそうな気がします(実際にそのようなメソッドがあるのかはこれから勉強していくことになりますが・・・)。 現時点でツールバーの未実装箇所として先ほどあげたサイズボタン、フォントボタンの他に下線ボタンがあります。 次はこの下線ボタンを実装したいと考えています。 基本はBOLDの時と同じ仕組みで、Font.BOLDのBOLDにあたる部分を下線に変えて実装しようとしたのですが、下線が見当たりませんでした。調べてみたところFont.PLAINとFont.ITALICは用意されているようなのですが・・・。 下線はFontクラスには用意されていないのでしょうか?
argius

2015/09/14 07:32

下線については、下記サイトを参照して下さい。 (他のと比べると少し難しいですね。) JTextFieldの文字列に下線を付ける - Java Swing Tips http://ateraimemo.com/Swing/TextAttribute.html kompiroさんも書いていますが、このサイトはSwingの情報が非常に充実していますので、「サイト内検索」で調べてみてください。
DaiAoki

2015/09/14 07:44

ご回答ありがとうございます。 ご紹介いただいたサイトをじっくりと読んで、コードを書いてみます。 コードを書き終えたらまた来ます。
DaiAoki

2015/09/14 08:50

コードを書いてみました。 以下に関連する部分だけ抜粋しています。 static class MyCellRenderer extends DefaultTableCellRenderer { Font baseFont; JTable table; Map<TextAttribute,Object> attrs; public MyCellRenderer(JTable table){ this.table=table; this.attrs=new HashMap<>( ); attrs.put(TextAttribute.UNDERLINE,TextAttribute.UNDERLINE_LOW_DOTTED); } public void applyUnderLineToSelectedCells( ){ baseFont=table.getFont( ); int[ ] cols=table.getSelectedColumns( ); int[ ] rows=table.getSelectedRows( ); for(int row : rows){ for(int col : cols){ Point k=new Point(col,row); Object v=baseFont.deriveFont(attrs); attrs.put(k,v); } } table.updateUI( ); } @Override public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus,int row, int column) { Component c=super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); Point key=new Point(column,row); if(attrs.containsKey(key));{ Object object=attrs.get(key); c.setFont(object); } return this; } } MapにキーとしてTextAttributeを渡すことになっていると思いますが、Pointクラスのkとして渡したところコンパイルできませんでした。 そこで、TextAttributeをPointに変えて、Pointで選択された範囲をキーとしようと考えたのですが、そうすると、 attrs.put(TextAttribute.UNDERLINE,TextAttribute.UNDERLINE_LOW_DOTTED); の行が使えなくなってしまいました。 ifの( )内もキーが正しく選択されていないため、setFontが使えませんでした。 不具合箇所に合うよう修正すると他の箇所に不具合が生じてしまってうまくいきません。 どの部分がおかしいのでしょうか?
argius

2015/09/14 09:10

別のMapが出てきたので混同しているようですね。 前に登場したcellXXXMapと、下線で使用するattrsのMapは、まったく種類の違うものです。 cellXXXMapは、キーをセル(Pointで表現)に、値をスタイル(FontやColorで表現)として関連付けをして保存するために作ったものです。 一方、attrsは、フォントの種類、スタイル、サイズ以外の属性を変更するために使用するものです。deriveFontをするためだけに使います。
DaiAoki

2015/09/15 05:36

ご回答ありがとうございます。 > 一方、attrsは、フォントの種類、スタイル、サイズ以外の属性を変更するために使用するものです。deriveFontをするためだけに使います。 APIリファレンスなどを見ながら考えてみました。こちらの文の意図を正しく理解できているか確認していただいてもよろしいでしょうか? FontクラスのderiveFont()メソッドの引数には、BOLDやサイズの他にもMapクラスの変数を指定することができる。 つまり、Mapクラスのattrsを下線と定義し、それをderiveFont()することで、新たにFontクラスの下線フォントを得ることができる。 そしてそれをvとし( Font v=deriveFont(attr); )、mapにValueとして渡し、ボルドーの時と同様の処理手順を行う。 それと関連して、deriveFontの意味をリファレンスで確認したときに最初はあまりしっくりこなかったのですが、つまりは新しいフォントを作りだすということなのでしょうか? 例えば、ボルドーボタンを作る時に、setBold()のようなメソッドが仮にあれば簡単でしたが、それがないためにsetFont()で、引数としてフォントを与えるといったことをするために、deriveFontでフォントを作りだすといった感覚でしょうか? 質問が多岐に渡ってしまい(質問自体もわかりにくくて)、申し訳ございません。
DaiAoki

2015/09/15 06:35 編集

【追記】 コードを実際に書いて、動作させたところ、うまく機能させることができました。 最終的に以下のようなコードになりました。 static class MyCellRenderer extends DefaultTableCellRenderer { Font baseFont; JTable table; Map<Point,Font> cellUnderLineMap; public MyCellRenderer(JTable table){ this.table=table; this.cellUnderLineMap=new HashMap<>( ); } public void applyUnderLineToSelectedCells( ){ baseFont=table.getFont( ); int[ ] cols=table.getSelectedColumns( ); int[ ] rows=table.getSelectedRows( ); for(int row : rows){ for(int col : cols){ Point k=new Point(col,row); Map<TextAttribute,Object> attrs=new HashMap<>(baseFont.getAttributes( )); attrs.put(TextAttribute.UNDERLINE,TextAttribute.UNDERLINE_LOW_DOTTED); Font v=baseFont.deriveFont(attrs); cellUnderLineMap.put(k,v); } } table.updateUI( ); } @Override public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus,int row, int column) { Component c=super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); Point key=new Point(column,row); if(cellUnderLineMap.containsKey(key)){ Font font=cellUnderLineMap.get(key); c.setFont(font); } return this; } } } 実際のコードはこれに先日作ったボルドーボタン、赤色ボタンのコードも加わります。 機能上は全く問題ないのですが、参考までにお聞きしたいことがあります。 現在のコードは類似するMapが2つあります。 Map<Point,Font> cellRendererMap; Map<Point,Font> cellUnderLineMap; の2つです。 ここに、新たにMap<Point,Font> cellSizeMap;などが加わることを考えると、コードが長くなって見栄えが悪いような気がします(気にするなと言われればそれまでなのですが・・・)。 今回は完成してもそれほど長くならないと思いますが、今後のことを考えて、もしも類似したMapがある場合はどのようにすれば短くできるのでしょうか?
argius

2015/09/15 08:45

前にも書きましたが、Mapは "Map<Point, CellStyle> cellStyleMap" のひとつだけにして、書式を追加する時にはそのクラスを拡張するように作ればスッキリするでしょう。 ただ、そうするには、もう少しJavaの基本的なところを学習されてからでないと難しそうです。 Swingは理解しにくいので大変だと思いますが、Javaの入門はいくらでもありますから、そちらをある程度できるようになってからの方が近道だと思いますよ。
DaiAoki

2015/09/15 13:36

ご回答ありがとうございます。 こちらのやり方ですね。↓ >考え方はapplyBoldToSelectedCellsのときとまったく同じです。どのような属性を持たせたいのか分からないので前回はFontだけにしましたが、今後も拡張したいのであれば、書式クラス(例:CellStyleクラス)を作ってそれをMap(Map<Point, CellStyle> cellStyleMap)に持たせると良いでしょう。 Fontをextendsし、Fontクラスの設計を参考にしながらアンダーラインなどを追加していくというのは何となくイメージできるのですが、具体的にどうすれば良いかよくわからないので、これについてはもう少し勉強を進めたら挑戦していきたいと思います。 メモ帳作りと並行して基礎固めも行っているので、勉強しながらいつの間にかできるようになっていたら・・・と淡い期待をしております。 あとは、フォントリストとサイズリストの実装でひと段落です。 Swingに関する書籍を購入したので、そちらも参考にしながらコードを書くところまでやってみます。 またご報告まで数日空くと思いますが、よろしくお願いします。
argius

2015/09/15 13:55 編集

そのやり方です。 --- 何かを作るには、まずは、やる気、モチベーションが大事だと思っています。 初めて(ですよね?)のSwingでこのような機能を実装するには心が折れてもおかしくないと思いますが、DaiAoki30さんのやる気には感心します。 APIドキュメントと書籍をしっかり読めば、きっとできると思いますよ。 頑張ってください。
DaiAoki

2015/09/16 12:56 編集

ご回答ありがとうございます。 まだプログラミングを勉強し始めてから2ヶ月程なので、ちゃんとした(?)ものを作るのは今回で初めてです。 APIの読み方もわからない状態からのスタートでしたが、argiusさんの助言なしにはここまで進めることができませんでした。本当にありがとうございます。 昨日、今日とでフォントリストとサイズリストのコードを書いてみました。 フォントリストの方は問題なく動作させることができたのですが、サイズリストがうまくいきません。コンパイルには成功するのですが、サイズが変わりません。 以下がそのコードです。(リスナーやコンボボックス自体は省略しています) static class MyCellRenderer extends DefaultTableCellRenderer { Font baseFont; JTable table; Map<Point,Font> cellFontMap; Map<Point,Font> cellSizeMap; public MyCellRenderer(JTable table){ this.table=table; this.cellFontMap=new HashMap<>( ); this.cellSizeMap=new HashMap<>( ); } public void applyFontToSelectedCells( ){ baseFont=table.getFont( ); int[ ] cols=table.getSelectedColumns( ); int[ ] rows=table.getSelectedRows( ); for(int row : rows){ for(int col : cols){ Point k=new Point(col,row); String name=comboFonts.getSelectedItem( ).toString( ); Font v=baseFont.decode(name); cellFontMap.put(k,v); } } table.updateUI( ); } public void applySizeToSelectedCells( ){ baseFont=table.getFont( ); int[ ] cols = table.getSelectedColumns( ); int[ ] rows = table.getSelectedRows( ); for (int row : rows) { for (int col : cols) { Point k = new Point(col, row); int size; try{ size=Integer.parseInt(comboSizes.getSelectedItem( ).toString( )); }catch(NumberFormatException ex){ return; } Font v=baseFont.deriveFont(size); cellSizeMap.put(k, v); } } table.updateUI( ); } @Override public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus,int row, int column) { Component c=super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); Point key=new Point(column,row); if(cellFontMap.containsKey(key)){ Font font=cellFontMap.get(key); c.setFont(font); } if(cellSizeMap.containsKey(key)){ Font font=cellSizeMap.get(key); c.setFont(font); } return this; } } コンボボックスで選択されたものをgetSelectedItem( ).toString( )でそれぞれ受け取ってフォントの方はderiveFont( )メソッドに直接、引数として渡せなかったので、decode( )メソッドでフォントに変換しました。 サイズの方はderiveFont( )メソッドの引数に直接渡しました。 フォントの方はうまく機能したのですが、サイズの方はうまく機能しません。 エラー箇所はありませんし、なぜ変わらないのか検討がつきません。 一つ可能性として考えたのはセルの幅が小さいため、文字の大きさを変えられないということでしたが、文字を小さくする場合でも変わりませんでした。 何かヒントをお教えいただけないでしょうか?
argius

2015/09/16 13:02

そこは確かに陥りやすい罠ですね。 APIドキュメントを良く見てみると分かりますが、サイズはfloat型で渡さないといけません。intだとstyle(BOLDとかの)設定になってしまいます。 逆に言えば、"10.5"のようなサイズも渡せるということです。 float size=Float.parseFloat(comboSizes.getSelectedItem( ).toString( ));
DaiAoki

2015/09/16 15:15 編集

ご回答ありがとうございます。 たしかにAPIを確認したところ、サイズはfloat型でした。サイズなので、反射的にintだと思い込んでいました。思い込みは良くないという教訓になりました。 修正したところ、サイズも無事に反映されました。 ですが一つ不具合を発見しました。 それぞれ単体で文字を変更する時は問題なくできるのですが、組み合わせるとうまくいきません。 例) ・ボルドーかつ下線 ・下線かつサイズ変更 など 今あるボタンが、 フォントボタン、サイズボタン、ボルドーボタン、下線ボタン、赤色ボタンの5種類なのですが、「赤色ボタン+4種類のいずれか1つ」という組み合わせは機能しました。 おそらく、赤色ボタンだけc.setColorとしているためだと思われます。 また、バグの原因を調べるためにいろんな組み合わせを調べたのですがある法則を見つけました。 それは、 最初に下線ボタンを押すと、以降、他3種への変更を受け付けない。 ボルドーボタンを押すと、下線ボタンへの変更は受け付けるが、他2種への変更は受け付けない。 サイズボタンを押すと、ボルドー、下線ボタンへの変更は受け付けるが、フォントボタンへの変更は受け付けない。 フォントボタンを押すと、他3種への変更を受け付ける。 ということです。 これらの if(XXXMap.containsKey(key)){ //処理 } というコードが上から順にフォント、サイズ、ボルドー、下線という並びになっているので、ここに原因があるのかもしれないと思い、試しに下線をコードの一番上にしたところ、下線ボタンを押したあと、他3種への変更を受け付けるようになりました。 ここまでは分析できたのですが、肝心な「何が原因なのか?」、「どうやって修正するか?」がわかりません。get(key)する時の変数がすべてfontだったので、もしかしたらそれに原因があるのかもしれないと思い、変数をそれぞれ別にしてみましたが、解消されませんでした。
argius

2015/09/16 15:28

Fontは1種類しか設定できないので、deriveFontを使って組み合わせる必要があります。deriveというのは派生させるという意味ですね。 下線を設定済みのFontオブジェクトfont1があったら、Font font2 = font1.deriveFont(Font.Bold);することで、font2が下線+ボールドのフォントになります。
DaiAoki

2015/09/16 16:20

ご回答ありがとうございます。 >下線を設定済みのFontオブジェクトfont1があったら、Font font2 = font1.deriveFont(Font.Bold);することで、font2が下線+ボールドのフォントになります。 今のコードの状態だと、 Font baseFont=table.getFont( ); としていて、変更された部分まで受け取れていないということでしょうか? 例えば、変更された状態も受け取るXXXメソッドがあったとして、 Font baseFont=table.XXX( ); Font v=baseFont.deriveFont(size); などとすれば、前に変更された箇所も引き継げるというような考え方でしょうか?
argius

2015/09/16 16:27

table.getFontのフォントはセルに設定したフォントでないので引き継げていないと思います。Mapに設定済みのフォントがあったらそれをbaseに使うようにすれば良いと思います。
DaiAoki

2015/09/17 04:32

ご回答ありがとうございます。 コードを書き直してみました。 ボルドー→サイズ変更とできるように、applySizeToSelectedCellsメソッドを変更してみました。 static class MyCellRenderer extends DefaultTableCellRenderer { Font baseFont; JTable table; Map<Point,Font> cellRendererMap; Map<Point,Font> cellSizeMap; public MyCellRenderer(JTable table){ this.table=table; this.cellRendererMap=new HashMap<>( ); this.cellSizeMap=new HashMap<>( ); } public void applySizeToSelectedCells( ){ int[ ] cols = table.getSelectedColumns( ); int[ ] rows = table.getSelectedRows( ); for (int row : rows) { for (int col : cols) { Point k = new Point(col, row); float size; try{ size=Float.parseFloat(comboSizes.getSelectedItem( ).toString( )); }catch(NumberFormatException ex){ return; } //以下3行を変更しました。 if(cellRendererMap.containsKey(k)){ baseFont=cellRendererMap.get(k); } Font v=baseFont.deriveFont(size); cellSizeMap.put(k, v); } } table.updateUI( ); } public void applyBoldToSelectedCells( ) { baseFont = table.getFont( ); int[ ] cols = table.getSelectedColumns( ); int[ ] rows = table.getSelectedRows( ); for (int row : rows) { for (int col : cols) { Point k = new Point(col, row); Font v = baseFont.deriveFont(Font.BOLD); cellRendererMap.put(k, v); } } table.updateUI( ); } @Override public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus,int row, int column) { Component c=super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); Point key=new Point(column,row); if(cellSizeMap.containsKey(key)){ Font ontf=cellSizeMap.get(key); c.setFont(ontf); } if(cellRendererMap.containsKey(key)){ Font ntfo=cellRendererMap.get(key); c.setFont(ntfo); } return this; } } 自分の意図としては、ifで、もしcellRendererMapにキー(選択されている範囲)が入っていた場合、baseFontとしてボルドーを受け取るというものです。 その後、ボルドーを引き継いで、さらにサイズ変更するためにFont v=baseFont.deriveFont(size);としています。 コンパイルはできたのですが、動作は変わりませんでした。 それに、ifを使った方法だと3つ4つと組み合わせていきたいとなった時にやりにくいという気もします。 どういった方法が考えられるでしょうか?
argius

2015/09/17 04:42

applyBoldToSelectedCellsの中で混ぜないと意味ないですね。 Mapの中に保存されたFontがどういう状態になっているかを考えてみましょう。 やりにくいところは今後の課題にして、まずは動くところだけ考えた方が良いです。 あと、この質問はコメントが長くなりすぎたので、「やりにくいところを改善する」部分は新たに質問した方が、他の回答者さんのご意見も聞けると思いますよ。
DaiAoki

2015/09/17 05:08

>eripongさん ご指摘いただきありがとうございます。全く気づいていませんでした。 先日も、booleanのことをずっとブーリーンと読んでいて、ブーリアンと気づいて恥ずかしくなりました。独学の弊害ですね。 こういった部分も徐々に意識的に直していきたいと思います。
DaiAoki

2015/09/17 05:19

>argiusさん ご回答ありがとうございます。 そうですね・・・ここまでこれただけでも自分としてはかなり成長できたと思いますし、こういった部分は今後の課題にしていきたいと思います。 argiusさんの助言を元に、試行錯誤しながら直していきたいと思います。 長きにわたってとても親切に回答していただき、本当にありがとうございました。 アプリが完成したら本当はいち早くargiusさんにご報告したいところですが、それはサイトの仕様上難しいので、また何かの質問の機会に必ずご報告します。 その際はよろしくお願いします。 メモ帳自体は、saveとopenの機能を実装して、動作上の不具合を直したら完成というところまできました。 より勉強を重ねて、良いものを作り出せるようになりたいと思います。 本当にありがとうございました。
argius

2015/09/17 06:26

すみません、「applyBoldToSelectedCellsの中で混ぜないと意味ないですね。」は間違いです。 (CellStyle方式の場合はapplyBoldToSelectedCellsの中で混ぜるんですが、今はまだMapが分かれているんでした。) getTableCellRendererComponentの中で、複数のFont設定を合成します。 Font font = table.getFont(); // これをベースに if(cellSizeMap.containsKey(key)){ Font f = cellSizeMap.get(key); font = font.deriveFont(f.getSize2D()); // fontにsizeを合成 } if(cellRendererMap.containsKey(key)){ Font f = cellRendererMap.get(key); font = font.deriveFont(f.getStyle()); // fontにstyleを合成 } あと、できればで良いですが、変数名はこうした方が分かりやすいと思います。 (すみません、最初にそう説明しておけば良かったんですけど...) cellRendererMap => cellFontStyleMap cellSizeMap => cellFontSizeMap 最後に。 プログラミングは、何か作ろうとするその気持ちがいちばん大切だと思いますので、ぜひその気持ちを維持して色んなものを作っていってください。
DaiAoki

2015/09/17 16:29

ご回答ありがとうございます。 その方法は思いつきませんでした、なるほど・・・。argiusさんの方法で、フォントサイズとボールドについては解決しました。 このタイミングでもう一度質問するのも気が引けるのですが、もしよろしければ質問をお受けしていただいてもよろしいでしょうか? フォントボタン(ファミリー名?明朝体など)と下線ボタンなのですが、うまく機能させることができませんでした。 同様の手順でコードを書いていった時に、セルサイズボタンでいうところのgetSize2D()メソッドにあたる適切なメソッドがわかりませんでした。 下線ボタンについてはMap attrsとして渡していたので、getAttributes()を使ったのですが、下線にすることはできても他と組み合わせることができませんでした。 フォントボタンについてはgetName()、getFamily()、getFontName()などいろいろ試したのですが、フォントを変更することすらできませんでした。 それぞれどのようなメソッドで受け取れば良いでしょうか?
argius

2015/09/18 06:24

その辺は私もやったこと無いので確実には分かりませんが。 下線の方は、両方から取り出したMapを混ぜてみてください。 map.putAllをすれば、片方のMapに集約できるはず。 Map attrs1 = font1.getAttributes(); Map attrs2 = font2.getAttributes(); attrs1.putAll(attrs2); font1.deriveFont(attrs1); フォント名はMap attrsに設定するんだと思いますが、詳しくは分かりません。 前述のサイト(Swing TIPS)に載っているかも知れませんので調べてみてください。
DaiAoki

2015/09/25 13:42

ご回答ありがとうございます。 ご報告が遅くなり申し訳ございません。 無事に下線とボールドなどの複合系の実装をすることができました。 現在は、いよいよSaveとOpenボタンの実装にとりかかり始めています。 シリアライズなど見慣れない言葉が多くまた手こずりそうですが、何とかメモ帳としての形にまで持っていけたらと思います。 本当にありがとうございました。 また機会があればよろしくお願いします。 完成しましたら、こちらに報告しにきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問