Javascript 字体大小从 win 10 更改为 win 11
Javascript font size changes from win 10 to win 11
我们有一个大型 Java 应用程序,在 Win 10 上看起来不错。当我们在 Win 11 上测试它时,大约 1/2 的控件的字体比其他控件小得多。
这是在两台机器上使用相同版本的 Open JDK Java 11 VM。
我的搜索没有找到任何东西,但奇怪的是只有我们的 Java 应用有这个问题。
有一次我确实有一个工具,让我只需单击 java 应用程序 window/control 即可查看有关它的所有信息(颜色、字体大小等)。那是几年前的事了,我现在似乎找不到这样做的人了。
关于为什么某些字体会在 Win 11 上改变大小的任何想法?
您需要了解不同的事情。例如:
属于同一类但类型不同的数据将存储在 class 或结构中。
许多相同类型的数据将存储在一个数组中,或者在此示例中存储在一个 std::vector
中,因为它可以动态增长。
所以,正如您已经做的那样,您将把一行数据,或者用数据库语言,将一条记录的数据放在一个结构中。
所以,您的方法是正确的,定义了 TaxPayer class。但是现在因为要累加多个TaxPayer的一个数据字段的总和,所以需要把所有的TaxPayer放在一个std::vector
中,再封装在一个class中。然后向 class 添加其他函数,以计算 std::vector
.
中记录 (TaxPayer) 的总和
示例:
#include <string>
#include <vector>
struct TaxPayer {
std::string taxpayerId{};
std::string name{};
std::string address{};
std::string postcode{};
int salary{};
int deductions{};
double taxDue{};
};
struct TaxPayers {
std::vector<TaxPayer> taxPayers{};
};
我这里只展示数据成员。您当然可以重用现有功能。
现在,我们基本上只需要添加两个重要的功能:
- 将一个源行拆分为其元素,然后将其分配给 taxPayer 数据字段
- 读取所有纳税人
第一个任务是拆分所谓的 CSV(逗号分隔值)数据。您将在 Whosebug 上找到至少 1000 个关于如何执行此操作的示例。一个非常流行的方法是使用 std::getline
并读取一部分文本直到分隔符 ','.
为了更省事,首先通过std::getline
读取源文件的完整行。然后,这将被放入 stringstream
并从那里完成进一步的数据提取。
所有这些都将嵌入到一个覆盖的“提取”运算符 >>
中,用于处理您的特定数据。
这样一个算子的签名是:
friend std::istream& operator >> (std::istream& is, TaxPayer& tp)
实现功能后,只需使用>>
运算符,即可读取一整行并一步解析。
在 TaxPayers class 中,您还需要定义这样的运算符并使用上述定义中的提取器读取所有行。
通过这种方法,通过将一个大任务拆分成多个小任务,最终解决方案将变得非常简单。
最后但同样重要的是,我们需要为您添加 std::vector
中数据的累积功能。这可以通过一个简单的循环来完成,或者更高级一点,使用 std::accumulate
.
您可以使用以下示例作为重构现有代码的想法:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
struct TaxPayer {
// Data part
std::string taxpayerId{};
std::string name{};
std::string address{};
std::string postcode{};
int salary{};
int deductions{};
double taxDue{};
// Extractor
friend std::istream& operator >> (std::istream& is, TaxPayer& tp) {
// Read a complete line
std::string line{};
if (std::getline(is, line) and not line.empty()) {
// Put it into a stringstream for further extraction
std::istringstream iss{ line };
// Now, extract the data parts
std::getline(iss, tp.taxpayerId, ',');
std::getline(iss, tp.name, ',');
std::getline(iss, tp.address, ',');
std::getline(iss, tp.postcode, ',');
// Read and convert
std::getline(iss, line, ',');
tp.salary = std::stoi(line);
std::getline(iss, line, ',');
tp.deductions = std::stoi(line);
std::getline(iss, line, ',');
tp.taxDue = std::stod(line);
}
return is;
}
// Simple inserter
friend std::ostream& operator << (std::ostream& os, const TaxPayer& tp) {
return os << tp.taxpayerId << ' ' << tp.name << ' ' << tp.address << ' ' << tp.postcode
<< ' ' << tp.salary << ' ' << tp.deductions << ' ' << tp.taxDue << '\n';
}
};
struct TaxPayers {
// Data
std::vector<TaxPayer> taxPayers{};
// Sum functions
int sumSalary() {
int result{};
for (const TaxPayer& taxPayer : taxPayers)
result += taxPayer.salary;
return result;
}
int sumDeductions() {
int result{};
for (const TaxPayer& taxPayer : taxPayers)
result += taxPayer.deductions;
return result;
}
// Extractor
friend std::istream& operator >> (std::istream& is, TaxPayers& tp) {
// clar old data
tp.taxPayers.clear();
// Read all new existing data and store in vector
TaxPayer taxPayer{};
while (is >> taxPayer)
tp.taxPayers.push_back(taxPayer);
return is;
}
// Simple inserter
friend std::ostream& operator << (std::ostream& os, const TaxPayers& tp) {
for (const TaxPayer& taxPayer : tp.taxPayers)
os << taxPayer;
return os;
}
};
// Same as a file, I just use it here for better visibility
std::istringstream sourceFile{ R"(7101003,Mike,23 boinig road,2615,48000,12000,0
7201003,Jane Philips,29 boinig cresent,2616,47000,12000,0
7301003,Philip Jane,23 bong road,2615,49000,000,0
7401004,Peta,23 bong bong road,2615,148000,19000,0
7101205,Abdulla,23 Station st,2615,80000,21000,0)" };
int main() {
TaxPayers taxPayers{};
// Read and parse all tax payers
sourceFile >> taxPayers;
// Debug output: Show, what we just read
std::cout << taxPayers;
// Show sums
std::cout << "\n\n\nSummary\n\nSalary:\t\t" << taxPayers.sumSalary() << "\nDeductions:\t" << taxPayers.sumDeductions() << '\n';
}
我们有一个大型 Java 应用程序,在 Win 10 上看起来不错。当我们在 Win 11 上测试它时,大约 1/2 的控件的字体比其他控件小得多。
这是在两台机器上使用相同版本的 Open JDK Java 11 VM。
我的搜索没有找到任何东西,但奇怪的是只有我们的 Java 应用有这个问题。
有一次我确实有一个工具,让我只需单击 java 应用程序 window/control 即可查看有关它的所有信息(颜色、字体大小等)。那是几年前的事了,我现在似乎找不到这样做的人了。
关于为什么某些字体会在 Win 11 上改变大小的任何想法?
您需要了解不同的事情。例如:
属于同一类但类型不同的数据将存储在 class 或结构中。
许多相同类型的数据将存储在一个数组中,或者在此示例中存储在一个 std::vector
中,因为它可以动态增长。
所以,正如您已经做的那样,您将把一行数据,或者用数据库语言,将一条记录的数据放在一个结构中。
所以,您的方法是正确的,定义了 TaxPayer class。但是现在因为要累加多个TaxPayer的一个数据字段的总和,所以需要把所有的TaxPayer放在一个std::vector
中,再封装在一个class中。然后向 class 添加其他函数,以计算 std::vector
.
示例:
#include <string>
#include <vector>
struct TaxPayer {
std::string taxpayerId{};
std::string name{};
std::string address{};
std::string postcode{};
int salary{};
int deductions{};
double taxDue{};
};
struct TaxPayers {
std::vector<TaxPayer> taxPayers{};
};
我这里只展示数据成员。您当然可以重用现有功能。
现在,我们基本上只需要添加两个重要的功能:
- 将一个源行拆分为其元素,然后将其分配给 taxPayer 数据字段
- 读取所有纳税人
第一个任务是拆分所谓的 CSV(逗号分隔值)数据。您将在 Whosebug 上找到至少 1000 个关于如何执行此操作的示例。一个非常流行的方法是使用 std::getline
并读取一部分文本直到分隔符 ','.
为了更省事,首先通过std::getline
读取源文件的完整行。然后,这将被放入 stringstream
并从那里完成进一步的数据提取。
所有这些都将嵌入到一个覆盖的“提取”运算符 >>
中,用于处理您的特定数据。
这样一个算子的签名是:
friend std::istream& operator >> (std::istream& is, TaxPayer& tp)
实现功能后,只需使用>>
运算符,即可读取一整行并一步解析。
在 TaxPayers class 中,您还需要定义这样的运算符并使用上述定义中的提取器读取所有行。
通过这种方法,通过将一个大任务拆分成多个小任务,最终解决方案将变得非常简单。
最后但同样重要的是,我们需要为您添加 std::vector
中数据的累积功能。这可以通过一个简单的循环来完成,或者更高级一点,使用 std::accumulate
.
您可以使用以下示例作为重构现有代码的想法:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
struct TaxPayer {
// Data part
std::string taxpayerId{};
std::string name{};
std::string address{};
std::string postcode{};
int salary{};
int deductions{};
double taxDue{};
// Extractor
friend std::istream& operator >> (std::istream& is, TaxPayer& tp) {
// Read a complete line
std::string line{};
if (std::getline(is, line) and not line.empty()) {
// Put it into a stringstream for further extraction
std::istringstream iss{ line };
// Now, extract the data parts
std::getline(iss, tp.taxpayerId, ',');
std::getline(iss, tp.name, ',');
std::getline(iss, tp.address, ',');
std::getline(iss, tp.postcode, ',');
// Read and convert
std::getline(iss, line, ',');
tp.salary = std::stoi(line);
std::getline(iss, line, ',');
tp.deductions = std::stoi(line);
std::getline(iss, line, ',');
tp.taxDue = std::stod(line);
}
return is;
}
// Simple inserter
friend std::ostream& operator << (std::ostream& os, const TaxPayer& tp) {
return os << tp.taxpayerId << ' ' << tp.name << ' ' << tp.address << ' ' << tp.postcode
<< ' ' << tp.salary << ' ' << tp.deductions << ' ' << tp.taxDue << '\n';
}
};
struct TaxPayers {
// Data
std::vector<TaxPayer> taxPayers{};
// Sum functions
int sumSalary() {
int result{};
for (const TaxPayer& taxPayer : taxPayers)
result += taxPayer.salary;
return result;
}
int sumDeductions() {
int result{};
for (const TaxPayer& taxPayer : taxPayers)
result += taxPayer.deductions;
return result;
}
// Extractor
friend std::istream& operator >> (std::istream& is, TaxPayers& tp) {
// clar old data
tp.taxPayers.clear();
// Read all new existing data and store in vector
TaxPayer taxPayer{};
while (is >> taxPayer)
tp.taxPayers.push_back(taxPayer);
return is;
}
// Simple inserter
friend std::ostream& operator << (std::ostream& os, const TaxPayers& tp) {
for (const TaxPayer& taxPayer : tp.taxPayers)
os << taxPayer;
return os;
}
};
// Same as a file, I just use it here for better visibility
std::istringstream sourceFile{ R"(7101003,Mike,23 boinig road,2615,48000,12000,0
7201003,Jane Philips,29 boinig cresent,2616,47000,12000,0
7301003,Philip Jane,23 bong road,2615,49000,000,0
7401004,Peta,23 bong bong road,2615,148000,19000,0
7101205,Abdulla,23 Station st,2615,80000,21000,0)" };
int main() {
TaxPayers taxPayers{};
// Read and parse all tax payers
sourceFile >> taxPayers;
// Debug output: Show, what we just read
std::cout << taxPayers;
// Show sums
std::cout << "\n\n\nSummary\n\nSalary:\t\t" << taxPayers.sumSalary() << "\nDeductions:\t" << taxPayers.sumDeductions() << '\n';
}